OpenGL Extension
OpenGL擴展實際上是硬件的驅動程序的一部分,是針對硬件的特性而新開發的,它是由硬件設計者或OpenGL庫設計者按其規格說明書進行設計的,不用的OpenGL實現(OpenGL Implementation)支持的擴展可能不一樣,只是隨著某一擴展的推廣與應用以及硬件技術的提高,該擴展會在所有的OpenGL實現中給予支持,從而最終成為OpenGL 標準庫的一部分。
多重紋理是指在同一模型表面指定兩個或者兩個以上的紋理圖像,進而這些紋理圖形通過一定的融合方式進行混合以獲得逼真效果的一種技術。在標準的紋理映射過程中,將每個紋理對象都映射到多邊形一次,較早的顯卡只支持單或者雙紋理,這樣要實現多重紋理的效果,就需要采用不用的紋理圖像對該多邊形繪制多次,然通過混合操作來達到多重紋理效果,這顯然降低了系統的性能,而OpenGL擴展庫中提供了多重紋理技術,它允許在紋理映射流水線中依次將多少紋理應用到同個多邊形,每次紋理單元處理完就傳遞給下個單元,知到最后一個紋理單元完成其工作。
多重紋理的一個應用:用一個表示磚墻的紋理圖映射到墻面模型上,然后把一個表示聚光燈效果的灰度圖作為第二重紋理映射到上面,就形成了磚墻被一個聚光燈照亮的效果,這邊是通常所說的光照貼圖。OpenGL使用多重紋理,可以按照下面的步驟:1.檢查顯卡是否支持多重紋理擴展,支持則可獲取多重紋理擴展函數的指針地址。2.創建紋理對象,并載入紋理數據。3.為每個紋理單元指定其紋理映射參數,并綁定紋理。4.對個每個頂點,指定多組紋理坐標。void glActiveTexture(GLenum texUnit);該函數選擇一個紋理單元,線面的紋理函數將作用于該紋理單元上,參數為符號常量GL_TEXTUREi ,i的取值范圍為0~K-1,K是OpenGL實現支持的最大紋理單元數,可以使用GL_MAX_TEXTURE_UNITS來調用函數glGetIntegerv()獲取該值。glClientActiveTexture( );glClientActiveTexture和glActiveTexture類似,都是用來指定當前使用的紋理句柄的,之后是glEnableClientState進行激活動作,再用glTexCoordPointer指定VBO內的數據的格式,這都是針對紋理坐標VBO。
1
if( m_Keys.IsPressed('0'))
{
2
//打開第0層貼圖
3
glActiveTextureARB(GL_TEXTURE0_ARB);
4
glEnable(GL_TEXTURE_2D);
5
glBindTexture(GL_TEXTURE_2D,texture[0]);
6
//指定第0層貼圖的貼圖的坐標
7
glClientActiveTextureARB(GL_TEXTURE0_ARB);
8
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
9
glTexCoordPointer(2,GL_FLOAT,sizeof(Vertex_VT),&g_Quad[0].m_Texcoord );
10
//關閉第一層紋理
11
glActiveTextureARB(GL_TEXTURE1_ARB);
12
glDisable(GL_TEXTURE_2D);
13
//不去讀取第1層貼圖的貼圖坐標
14
glClientActiveTextureARB(GL_TEXTURE1_ARB);
15
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
16
17
}
18
if( m_Keys.IsPressed('9'))
{
19
//打開第0層貼圖
20
glActiveTextureARB(GL_TEXTURE0_ARB);
21
glEnable(GL_TEXTURE_2D);
22
glBindTexture(GL_TEXTURE_2D,texture[1]);
23
//指定第0層貼圖的貼圖的坐標
24
glClientActiveTextureARB(GL_TEXTURE0_ARB);
25
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
26
glTexCoordPointer(2,GL_FLOAT,sizeof(Vertex_VT),&g_Quad[0].m_Texcoord );
27
//關閉第一層紋理
28
glActiveTextureARB(GL_TEXTURE1_ARB);
29
glDisable(GL_TEXTURE_2D);
30
//不去讀取第1層貼圖的貼圖坐標
31
glClientActiveTextureARB(GL_TEXTURE1_ARB);
32
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
33
}
34
if( m_Keys.IsPressed('8'))
{
35
//打開第0層貼圖
36
glActiveTextureARB(GL_TEXTURE0_ARB);
37
glEnable(GL_TEXTURE_2D);
38
glBindTexture(GL_TEXTURE_2D,texture[0]);
39
//指定第0層貼圖的貼圖的坐標
40
glClientActiveTextureARB(GL_TEXTURE0_ARB);
41
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
42
glTexCoordPointer(2,GL_FLOAT,sizeof(Vertex_VT),&g_Quad[0].m_Texcoord );
43
//打開第1層貼圖
44
glActiveTextureARB(GL_TEXTURE1_ARB);
45
glEnable(GL_TEXTURE_2D);
46
glBindTexture(GL_TEXTURE_2D,texture[1]);
47
//設置兩張貼圖相加
48
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_ADD);
49
//指定第1層貼圖的貼圖的坐標
50
glClientActiveTextureARB(GL_TEXTURE1_ARB);
51
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
52
glTexCoordPointer(2,GL_FLOAT,sizeof(Vertex_VT),&g_Quad[0].m_Texcoord );
53
}
54


