我尝试在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给出了正确的结果。这是两张图片:
结果应如图1所示。
答案 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);
}
}
(免责声明)我只是猜测,这个错误真的很奇怪。