Opengl GLSL用于循环动作怪异

Opengl GLSL用于循环动作怪异,opengl,for-loop,glsl,shader,fragment-shader,Opengl,For Loop,Glsl,Shader,Fragment Shader,我试图在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, texC

我试图在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);
 }
}
for(int i=0;i<5;++i){
如果(i==1){
浮动淡入=纹理2d(alphaTextures[i],texCoord.st).r;
vec4 texCol=纹理2d(纹理[i],texCoord.ba);
texColor=混合(texColor、texCol、褪色);
}
}
代码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);
 }
}
for(int i=0;i<6;++i){
如果(i==1){
浮动淡入=纹理2d(alphaTextures[i],texCoord.st).r;
vec4 texCol=纹理2d(纹理[i],texCoord.ba);
texColor=混合(texColor、texCol、褪色);
}
}
if语句仅用于测试目的,因此它应该给出相同的结果。唯一的区别是循环条件。我真的不知道为什么只有代码1给出了正确的结果。这里有两张照片:


结果应该如图1所示。

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

请尝试以下方法:

 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);
    }
 }
for(int i=0;i<6;++i){
浮动淡入=纹理2d(alphaTextures[i],texCoord.st).r;
vec4 texCol=纹理2d(纹理[i],texCoord.ba);
如果(i==1){
texColor=混合(texColor、texCol、褪色);
}
}
(免责声明)我只是在猜测,这个错误真的很奇怪。

根据,你不能迭代取样器数组。索引
alphaTextures[i]
无效,只能使用
alphaTextures[1]


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

什么是“纹理飞溅”?“if语句只是为了测试目的,所以应该给出相同的结果。”为什么要给出相同的结果?最初我测试它时没有if语句和7个文本,但是第七个纹理使整个结果看起来完全不同。if语句应该只让数组的元素2通过,而不考虑纹理计数。