2011-07-12 17 views
7

私はシェーダを使用してOpenGL 2.1アプリケーションを開発していますが、フラグメント単位の照明に問題があります。シーンのイニシャルがロードされたときの照明は正しいですが、シーンのまわりをナビゲートすると、静的な場所にとどまるのではなく、「カメラ」で照明が動きます。たとえば、ライトを右に置くと、オブジェクトの右側が照らされます。カメラをオブジェクトの反対側に移動して逆の方向を向けると、ライティングはオブジェクトの右側に残ります(今のように、左になるのではなく)。私は間違った座標系で照明を計算していると仮定し、これは間違った動作を引き起こしています。私は... ...次の道を照らすvertexNormalは、オブジェクト/モデル空間で正常ですフラグメント単位の照明座標系

ECPosition = gl_ModelViewMatrix * gl_Vertex; 
WCNormal = gl_NormalMatrix * vertexNormal; 

を頂点シェーダで

を計算しています。上記のように、世界の右側に光を置く

フラグメントシェーダで

...

float lightIntensity = 0.2; //ambient 
lightIntensity += max(dot(normalize(LightPosition - vec3(ECPosition)), WCNormal), 0.0) * 1.5; //diffuse 
LightPositionは

、例えば、(100.0、10.0、0.0)。私が確信している部分は、gl_NormalMatrix部分です。私はこの行列が何であり、どの座標空間が私の法線を(私は世界空間を想定している)に置くのかを正確には分かりません。法線が世界の空間に置かれている場合、LightPositionとWCNormalがワールド空間にある間に、ECPositionが視空間にあるという問題があると考えました。これについての何かが正しいように見えないが、私はそれを理解できない。私は世界空間にECPositionを入れようとしましたが、自分のmodelMatrixでそれを掛けてみましたが、座標空間をワールド空間に入れるための変換が含まれていましたが、これはうまくいきませんでした。シェーダやコードに関するその他の情報を提供する必要があるかどうかを教えてください。

答えて

6

gl_NormalMatrixは、あなたの正常を視空間に変換します(詳細はthis tutorialを参照)。

私はあなたの光が静的な世界の位置にあるためには、あなたの現在のビューマトリックスでそれを乗算することで、あなたのLightPositionを視空間に変換するべきだと思います。

+0

gl_NormalMatrixについての良いチュートリアル。私は今それを理解する。 LightPositionを視空間に変換して何が起こるかを見てみよう。良い思い出。 – Nitrex88

+0

うん!感謝します...ありがとう! – Nitrex88

関連する問題