GLSL着色器和WebGL问题
问题描述:
我创建了一个在Firefox中完美工作的着色器,但在Chrome中,片段和顶点着色器无法链接。它们编译得很好,但在链接部分出现问题。我已经在代码的休闲位本地化了这个问题:GLSL着色器和WebGL问题
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]);
的统一是一个浮点值,即使它是一个类型转换的问题应该在编译时失败,而不是链接。
这里是完整的着色器,也许我错过了代码中的其他地方。
答
我设法使它的工作,事实证明,我有两个问题。一个是在计算att时除以0。它可以让我在漂浮物上划分一些东西,所以我把uLightAttenuation和uLightIntensity结合成一个单一的vec2制服,然后这部分工作。其次,在计算颜色时,我必须单独引用每个组件(颜色[0],颜色[1]等等),并且仅使用浮点变量而不使用矢量。之后,它在Chrome中正常工作。
请修改标题以反映被问到的问题。这个问题与统一的组件限制无关。 – 2011-03-06 16:47:17