OpenGL下多个sampler在shader中的使用

Posted 力为

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL下多个sampler在shader中的使用相关的知识,希望对你有一定的参考价值。


在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互换。


至此,真相大白。



以上是关于OpenGL下多个sampler在shader中的使用的主要内容,如果未能解决你的问题,请参考以下文章

基于Qt的OpenGL可编程管线学习(16)- 柔光强光叠加

Unity Shader:贴图采样器Sampler的使用

基于Qt的OpenGL可编程管线学习(18)- 平滑锐化边缘检测

基于Qt的OpenGL可编程管线学习(17)- 差值反差值排除

基于Qt的OpenGL可编程管线学习(17)- 差值反差值排除

OpenGL中的Shader