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 ループの一部です。ここに示されているように、まったくリンクしませんが、uLightAttenuation を att の計算から削除すると、次のようになります。
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]);
ユニフォームは float 値であり、型キャストに問題があったとしても、リンクではなくコンパイルで失敗するはずです。
これが完全なシェーダーです。コードのどこかで何かを見逃している可能性があります。