我的片段着色器之一模拟了一些基本的 OpenGL ES 1.1 多纹理特性。
作为其中的一部分,我声明了以下 GLSL 函数:
void applyTexture(int tuIdx) {
lowp vec4 texColor = texture2D(s_cc3Textures[tuIdx], v_texCoord[tuIdx]);
int tuMode = u_cc3TextureUnitMode[tuIdx];
if (tuMode == k_GL_COMBINE)
combineTexture(texColor, tuIdx);
else if (tuMode == k_GL_MODULATE)
fragColor *= texColor;
else if (tuMode == k_GL_DECAL)
fragColor.rgb = (texColor.rgb * texColor.a) + (fragColor.rgb * (1.0 - texColor.a));
else if (tuMode == k_GL_REPLACE)
fragColor = texColor;
else if (tuMode == k_GL_ADD) {
fragColor.rgb += texColor.rgb;
fragColor.a *= texColor.a;
}
else if (tuMode == k_GL_BLEND) {
fragColor.rgb = (fragColor.rgb * (1.0 - texColor.rgb)) + (u_cc3TextureUnitColor[tuIdx].rgb * texColor.rgb);
fragColor.a *= texColor.a;
}
}
k_GL_XXX
常量位于着色器的#defined
顶部。
为了执行多重纹理,这个函数被多次调用。对于 iOS 下的 SGX GPU,这是使用 for 循环成功完成的:
for (int tuIdx = 0; tuIdx < MAX_TEXTURES; tuIdx++) {
if (tuIdx == u_cc3TextureCount) return; // Break out once we've applied all the textures
applyTexture(tuIdx);
}
哪里u_cc3TextureCount
是 int 制服并且MAX_TEXTURES
是。#defined
2
奇怪的是,尝试手动展开此循环不起作用,并且不会绘制任何内容:
if (u_cc3TextureCount > 0) {
applyTexture(0);
}
if (u_cc3TextureCount > 1) {
applyTexture(1);
}
更奇怪的是,更基本的也没有:
applyTexture(0);
applyTexture(1);
至少可以说,这是完全出乎意料的行为!
我已经确认 is 的值u_cc3TextureCount
,2
因此所有这三种方法都应该产生相同的结果。
我试图展开循环的原因是几个 GPU,包括一些 Android GPU,以及 iPad Air 中的新 Apple A7 GPU 不能与循环正常工作。我正在尝试找到一种applyTexture()
多次调用该函数的方法,该方法适用于所有 GPU。
有人能向我解释为什么这种基本的循环展开不起作用吗?