0

我试图在 glsl 中实现一些东西来进行纹理飞溅,但是 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 语句仅用于测试目的,因此它应该给出相同的结果。唯一的区别是循环条件。我真的不知道为什么只有代码 1 给出了正确的结果。这里有两张图片:

代码1

代码2

结果应该如图 1 所示。

4

2 回答 2

1

根据这个答案,您不能迭代采样器数组。索引alphaTextures[i]无效,只能使用alphaTextures[1].

这在 GLSL 4.00+ (OpenGL 4.0+) 中发生了变化,您可以在其中拥有变量索引,但不能来自着色器输入/派生值。

于 2013-07-29T20:03:12.290 回答
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);
    }
 }

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

于 2013-07-29T18:11:33.357 回答