0

我的片段着色器之一模拟了一些基本的 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是。#defined2

奇怪的是,尝试手动展开此循环不起作用,并且不会绘制任何内容:

if (u_cc3TextureCount > 0) {
    applyTexture(0);
}
if (u_cc3TextureCount > 1) {
    applyTexture(1);
}

更奇怪的是,更基本的也没有:

applyTexture(0);
applyTexture(1);

至少可以说,这是完全出乎意料的行为!

我已经确认 is 的值u_cc3TextureCount2因此所有这三种方法都应该产生相同的结果。

我试图展开循环的原因是几个 GPU,包括一些 Android GPU,以及 iPad Air 中的新 Apple A7 GPU 不能与循环正常工作。我正在尝试找到一种applyTexture()多次调用该函数的方法,该方法适用于所有 GPU。

有人能向我解释为什么这种基本的循环展开不起作用吗?

4

0 回答 0