0

我创建了一个在 Firefox 中完美运行的着色器,但在 Chrome 中,片段和顶点着色器无法链接。它们编译得很好,但是在链接部分出现了问题。我已将问题定位在闲置的代码中:

        else if (uLightType[i] == 1) { //point light

        NdotL = dot(n, normalize(lightDir[i])); 

        if (NdotL > 0.0) {
            distance = length(lightDir[i]);
            att = (1.0 / (uLightAttenuation[i] * distance * distance));
            color += vec3(uLightColor[i]  * NdotL * uLightIntensity[i] * att);                  
        }
}

这段代码计算点光源反射的漫反射颜色。它是更大的 for 循环的一部分。如此处所示,它根本不会链接,但如果我从计算 att 中删除 uLightAttenuation,如下所示:

att = (1.0 / (distance * distance));    

它工作得很好。如果我用任何其他制服替换它,比如 uLightIntensity,

att = (1.0 / (uLightIntensity[i] * distance * distance));

再次它不会工作。如果我用一个简单的常量值/浮点变量替换它,奇怪的是它可以编译。更奇怪的是,如果我从计算颜色中删除 att,但将制服保持在当前位置,它运行得很好:

att = (1.0 / (uLightAttenuation[i] * distance * distance));
color += vec3(uLightColor[i]  * NdotL * uLightIntensity[i]);

制服是一个浮点值,即使它是类型转换的问题,它也应该在编译时失败,而不是链接。
这是完整的着色器,也许我在代码的其他地方遗漏了一些东西。

片段着色器
顶点着色器

4

1 回答 1

2

我设法让它工作,结果我有两个问题。一种是在计算att时除以0。它可以让我在浮动制服上划分一些东西,所以我将 uLightAttenuation 和 uLightIntensity 组合成一个单一的 vec2 制服,在那部分工作之后。其次,在计算颜色时,我必须单独引用每个组件(颜色 [0]、颜色 [1] 等),并且只能使用浮点变量而不是向量。之后,它在 chrome 中正常工作。

于 2011-02-08T19:01:42.477 回答