一、简单介绍
在先前的时候,我一直都是只给要渲染的几何体中将一个单独的纹理加载到一个纹理对象上面,然后我们要使用纹理的时候就会去绑定它到选定的纹理对象上面。传递给片元着色器的uniform sampler2D texture设置为0,这里传0是因为我们默认使用的就是第一个纹理单元也就是默认激活的纹理单元texture0。
其实在片元着色器中我们可以使用多个纹理,然后在片元着色器中让这些纹理颜色进行相乘得到最后的结果。这样的话我们就可以设置多个纹理能够同时的应用到几何体中。
二、具体分析
纹理单元其实是硬件支持的,如果我们需要去检查显卡支持纹理单元个数,我们可以调用下面的函数
GLint iUnits;
glGetIntegerv(GL_MAX_TEXTURE_UNITS,&iUnits);
所有纹理绑定的操作其实都会去影响到当前活动的纹理单元,我们可以去调用
glActiveTexture(GL_TEXTURE1)来改变我们当前活跃的纹理单元,其中GL_TEXTURE1表示的就是纹理单元标识符。
具体使用,比如说下面就是激活相应的纹理单元,然后去绑定纹理对象
glActiveTexture(GL_TEXTURE1);
//绑定纹理
glBindTexture(GL_TEXTURE_2D, tarnishTexture);
//设置激活纹理单元0
glActiveTexture(GL_TEXTURE0);
//绑定纹理
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeTexture);
然后传入到着色器程序中可以这样去传入,传入的就是将要采样的纹理所绑定的纹理单元
glUniform1i(locCubeMap, 0);
glUniform1i(locTarnishMap, 1);
然后在片元着色器中的使用
void main()
{
gl_FragColor = textureCube(cubeMap, vVaryingTexCoord.stp)*texture2D(tarnishMap, vTarnishCoords);
}
下面这是一个纹理
还有一个是这样的,当然这个只是天空盒子的纹理一角
混合的效果