在OpenGL中,sampler2D/Cube等做为uniform可以在fragment shader中使用。结合glActiveTexture和glUniform1i,实现texture与sampler的绑定。
正常情况下的使用,可以参照各种GLSL教程里的例子。这里说一下非正常情况下在shader中使用多个sampler。
比如在fragment shader中声明了多个sampler:
uniform samplerCube environmentMap; uniform sampler2D baseTexture; uniform sampler2D bumpTexture; uniform bool enableEnvronmentMap; uniform bool useBaseTexture; uniform bool enableBump;
从声明上可以看出,这里用了三个变量分别控制是否在shader program中使用对应的sampler。比如,把enableBump设置为false,shader中就不用调用bumpTexture这个sampler2D。从而,在程序中就可以少调用glActiveTexture、glBindTexture、glEnable(GL_TEXTURE_2D)等。
等等,真的可以少调用glActiveTexture了吗?
之前,我是这样认为的。经过实践发现,确实是这样的。当然,与sampler对应的uniform必须设置。
另外一个问题,把enableBump设置为false后,sampler uniform的值需要调整吗?
假如baseTextue对应0, bumpTexture对应1,environmentMap对应2,那么如果把enableBump设置为false,不使用bumpTexture,也不为bump设置glActiveTexture,那其他两个unifrom应该设置何值?给bumpTexture设置何值?答案:0,1,2,即bumpTexture与environmentMap换位置了。从而可以得知,如果只使用environmentMap,应该为:environmentMap:0, baseTexture:1, bumpTexture:2,或者base与bump互换。
至此,真相大白。