2011-02-08 25 views
0

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)); 

もう一度動作しません。私が単純な定数値/ float変数に置き換えると、それは不思議にも十分にコンパイルされます。

att = (1.0/(uLightAttenuation[i] * distance * distance)); 
color += vec3(uLightColor[i] * NdotL * uLightIntensity[i]); 

均一フロート値であり、それがあったとしても:私は色の計算からATTを削除し、それの現在の位置で均一に保つならば、何でもより奇妙であること、である、それはうまく動作します型キャストの問題は、リンクしていないコンパイル時に失敗するはずです。
完全なシェーダがありますが、コード内の別の場所に何かが見当たりませんでした。

Fragment Shader
Vertex Shader

+0

質問の内容を反映するようにタイトルを編集してください。この質問は、均一なコンポーネントの制限とは関係ありません。 –

答えて

2

私はそれが動作するようにさせるために管理している、それは私が2つの問題を抱えていたが判明しました。 1つは、attを計算するときに0で除算することです。フロートの制服に何かを分けることができるので、uLightAttenuationとuLightIntensityを1つのvec2の制服にまとめました。第二に、色を計算するときには、すべてのコンポーネントを個別に参照する必要がありました(color [0]、color [1]など...)、ベクトルではなくfloat変数でのみ動作します。その後、それは正しくクロムに働いた。

関連する問題