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