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

フラグメント シェーダー
頂点シェーダー

4

1 に答える 1

2

なんとか機能させることができましたが、2つの問題があったことがわかりました。1 つは att を計算するときに 0 で割ったものです。float ユニフォーム上で何かを分割できるようにするため、uLightAttenuation と uLightIntensity を単一の vec2 ユニフォームに結合し、その後その部分が機能しました。次に、色を計算するときは、すべてのコンポーネント (color[0]、color[1] など) を個別に参照し、ベクトルではなく float 変数のみを使用する必要がありました。その後、クロムで正しく機能しました。

于 2011-02-08T19:01:42.477 に答える