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