GLSL着色器和WebGL问题

时间:2011-02-08 15:09:54

标签: glsl webgl

我创建了一个在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]);

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

Fragment Shader
Vertex Shader

1 个答案:

答案 0 :(得分:2)

我设法让它发挥作用,事实证明我有两个问题。一个是在计算att时用0除。它会让我将一些东西划分为浮动制服,所以我将uLightAttenuation和uLightIntensity合并为一个vec2制服,然后该部分起作用。其次,在计算颜色时,我必须单独引用每个组件(颜色[0],颜色[1]等...)并且仅使用浮点变量而不是向量。之后它在chrome中正常工作。