多重纹理
多重紋理就是在渲染一個(gè)多邊形的時(shí)候可以用到多張紋理圖.把多張紋理圖進(jìn)行一些顏色的操作,可以達(dá)到一些效果.但是多重紋理必須是在顯卡支持的情況下.但是還有一種多次渲染.可以替代多重紋理,但是這樣做的話,速度會很慢。
,在這個(gè)渲染過程中,你可以在不同的紋理單元分別放入第0次,第1次,第2次需要渲染的對象.當(dāng)程序向屏幕繪圖時(shí),將這些渲染結(jié)果疊加起來,將最終結(jié)果顯示到屏幕.??每個(gè)紋理單元對應(yīng)有其紋理環(huán)境,這個(gè)紋理環(huán)境指明了渲染的紋理圖片、渲染參數(shù)、過濾參數(shù)等等,其中有一個(gè)重要的項(xiàng)目指明了,程序在將渲染結(jié)果進(jìn)行逐個(gè)疊加的過程中,當(dāng)前的紋理單元內(nèi)的內(nèi)容如何與前面的內(nèi)容進(jìn)行混合.
??? 這個(gè)些參數(shù)中包含了:?
???? a . 要進(jìn)行混合的紋理的來源
?????????? 這個(gè)來源要分兩步指定:
?????????????? 1. 對象來自哪個(gè)紋理單元[例如GL_TEXTURE0, GL_TEXTURE1],??
????????????? 2.該單元中的什么成分[例如:GL_SRC_COLOR,GL_ONE_MINUS_SRC_COLOR]
???? b. 混合所使用的函數(shù)
?????????? 例如GL_ADD,GL_MODULATE,GL_INTERPLATE等
??? 通俗一點(diǎn)來說呢, 如果我們要進(jìn)行一次多重渲染就是要把兩個(gè)紋理進(jìn)行一次數(shù)學(xué)運(yùn)算把得到的結(jié)果投放到屏幕。??
??? 當(dāng)然這個(gè)數(shù)學(xué)運(yùn)算是需要你自己指定的這包括運(yùn)算類型,操作數(shù)來源,操作數(shù)的值, 就像下面這個(gè)簡單的代數(shù)式一樣:
??????????? C = A + B?
要算出這個(gè)結(jié)果,那么我們首先要指定要進(jìn)行什么運(yùn)算(這里是+),然后指定這個(gè)運(yùn)算的兩個(gè)操作數(shù)(這里是a和b,對于渲染還要知道他們來自哪個(gè)紋理單元).
???? 這些參數(shù)的指定都是通過用不同的參數(shù)來調(diào)用glTexEnv 完成的。然后我們就可以運(yùn)算了。這個(gè)C就是我們渲染的最終結(jié)果。
??? 具體來說:如果我們要進(jìn)行一次多重渲染:
那么首先我們要在各個(gè)紋理單元里面放入不同的紋理圖片
例如在第0號單元 放入texture[0]所對應(yīng)的圖片:
??? glActiveTextureARB( GL_TEXTURE0_ARB );
??? glEnable( GL_TEXTURE_2D );
??? glBindTexture( GL_TEXTURE_2D, texture[0] );?
例如在第1號單元 放入texture[1]所對應(yīng)的圖片:
??? glActiveTextureARB( GL_TEXTURE2_ARB );
??? glEnable( GL_TEXTURE_2D );
??? glBindTexture( GL_TEXTURE_2D, texture[1] );
然后 我們開始指定我們的代數(shù)運(yùn)算:
首先告訴OpenGL 我們要把兩個(gè)單元的紋理進(jìn)行混合:
??? glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB );
然后告訴OpenGL我們要進(jìn)行的運(yùn)算:
??? glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB );
這里 INTERPOLATE 是指線性插值,它的公式是這樣的:
??? C = Arg0*Arg2 + Arg1*(1-Arg2);
??? 翻譯成代數(shù)的是這樣:
??? C = a*ω + b*(1-ω) ; 這下大家可以清楚的看到它是一個(gè)線性插值表達(dá)式了吧
?其中: Arg0 是第一個(gè)操作數(shù),Arg1是第二個(gè)操作數(shù),Arg2 是線性插值的系數(shù)就是那個(gè)ω了。
這些都要通過下面的函數(shù)調(diào)用來指定。當(dāng)然,混合函數(shù)還可以是GL_ADD “加”,
GL_SUBTRACT “減”,GL_MODULATE “乘” 等等.
??? 下面來說 Arg0,Arg1,Arg2 的指定:
前面提到過:要指定一個(gè)操作數(shù),需要指定它來自于哪個(gè)紋理單元,和來自于該紋理單元的哪個(gè)部分:
所以我們在下面可以看到,指定一個(gè)Arg用了兩句話,第一個(gè)指定了這個(gè)操作數(shù)的內(nèi)容來自哪個(gè)紋理單元,第二個(gè)指定了來自于紋理單元里的哪個(gè)部分:
??? //前一個(gè) 這里指0號單元
??? glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB );?
??? //0號單元中的COLOR部分即RGB
??? glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR );?
?
??? //這個(gè)GL_TEXTURE指當(dāng)前活動的紋理單元也就是1號紋理單元
??? glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE );
??? glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR );?
?
??? //由紋理環(huán)境變量GL_PRIMARY_COLOR_ARB指定的值?
??? glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB );
??? glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR );
????
有了他們 就完成了混合函數(shù)的指定了,下面要做的事就是給一個(gè)幾何圖像同時(shí)綁上不同的紋理讓它們?nèi)グ瓷厦娴墓交旌习?:
??????? glBegin(GL_QUADS);
??????? glNormal3f(0.0,0.0,1.0);
??????? glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0,0.0);
??????? glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0,0.0);
??????? glVertex3f(0.0f,0.0f,0.0f);
?
??????? glNormal3f(0.0,0.0,1.0);
??????? glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0,1.0);
??????? glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0,1.0);
?
??????? glVertex3f(0.0f,1.0f,0.0f);
?
??????? glNormal3f(0.0,0.0,1.0);
??????? glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0,1.0);
??????? glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0,1.0);
??????? glVertex3f(1.0f,1.0f,0.0f);
?
??????? glNormal3f(0.0,0.0,1.0);
??????? glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0,0.0);
??????? glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0,0.0);
??????? glVertex3f(1.0f,0.0f,0.0f);
??? glEnd();
?
???
======================== 提供一些直觀的對比 =====================================
float arr0[4] = {g_T0Blend, g_T0Blend, g_T0Blend, g_T0Blend};
float arr1[4] = {g_T1Blend, g_T1Blend, g_T1Blend, g_T1Blend};
float arr2[4] = {g_T2Blend, g_T2Blend, g_T2Blend, g_T2Blend};
如果:
??? g_T0Blend = 0.5f
??? g_T1Blend = 0.25f
?? g_T2Blend = 0.25f
rn 為混合器n 的返回值
tn 為第n單元的紋理值
//Texture0??
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tobjects[TO_EARTH1]);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_CONSTANT);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, arr0);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
以上為紋理單元0 所作的操作,其公式是:
r0 = 0.5*t0?
//Texture1
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tobjects[TO_EARTH1]);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_COLOR);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, arr1);
對應(yīng)的公式是
r1 = (0.25*t1) + ((1-0.25)*r0) = 0.25*t1 + 0.375*t0
//Texture2
glActiveTextureARB(GL_TEXTURE2_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tobjects[TO_EARTH2]);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_COLOR);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, arr2);
對應(yīng)的公式是:
r2 = (0.25*t2) + ((1-0.25)*r1) = 0.25*t2 + 0.1875*t1 + 0.2813*t0
轉(zhuǎn)載于:https://www.cnblogs.com/ericleeviva/archive/2011/05/22/2053662.html
總結(jié)
- 上一篇: mysqL学习之实例
- 下一篇: jsp中session 和 cookie