GLSL for loop表现奇怪

时间:2013-07-28 22:03:43

标签: opengl for-loop glsl shader fragment-shader

我尝试在glsl中实现一些东西来进行纹理splatting,但是for循环表现得很奇怪,并且为完全相同的代码提供了不同的结果。

代码1:

for(int i = 0; i < 5; ++i) {
 if(i == 1) {
  float fade = texture2D(alphaTextures[i], texCoord.st).r;
  vec4 texCol = texture2D(textures[i], texCoord.ba);
  texColor = mix(texColor, texCol, fade);
 }
}

代码2:

for(int i = 0; i < 6; ++i) {
 if(i == 1) {
  float fade = texture2D(alphaTextures[i], texCoord.st).r;
  vec4 texCol = texture2D(textures[i], texCoord.ba);
  texColor = mix(texColor, texCol, fade);
 }
}

if语句仅用于测试目的,因此它应该给出相同的结果。唯一的区别是循环条件。我真的不知道为什么只有Code 1给出了正确的结果。这是两张图片:

Code1

Code2

结果应如图1所示。

2 个答案:

答案 0 :(得分:1)

根据this answer,您无法迭代采样器数组。索引alphaTextures[i]无效,您只能使用alphaTextures[1]

GLSL 4.00+(OpenGL 4.0+)中的这一变化,您可以在其中获得变量索引,但它不能来自着色器输入/派生值。

答案 1 :(得分:0)

一个原因可能是图形处理器不喜欢分支纹理提取。

请改为尝试:

 for(int i = 0; i < 6; ++i) {
    float fade = texture2D(alphaTextures[i], texCoord.st).r;
    vec4 texCol = texture2D(textures[i], texCoord.ba);

    if(i == 1) {
       texColor = mix(texColor, texCol, fade);
    }
 }

(免责声明)我只是猜测,这个错误真的很奇怪。