シェーダーを使用して OpenGL 2.1 アプリケーションを開発していますが、フラグメントごとの照明に問題があります。シーンを最初にロードしたときの照明は正しいのですが、シーンをナビゲートすると、静的な場所にとどまるのではなく、「カメラ」と共に照明が移動します。たとえば、ライトを右にずらして配置すると、オブジェクトの右側が照らされます。次に、カメラをオブジェクトの反対側に移動して反対方向に向けると、照明はまだオブジェクトの右側にあります (現在のように左側ではなく)。間違った座標系で照明を計算していると思いますが、これが間違った動作を引き起こしています。私は次の方法で照明を計算しています...
頂点シェーダーで...
ECPosition = gl_ModelViewMatrix * gl_Vertex;
WCNormal = gl_NormalMatrix * vertexNormal;
ここで、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 の部分です。このマトリックスが何であり、それが法線をどの座標空間に配置するのか正確にはわかりません(私はワールド空間を想定しています)。法線がワールド空間に配置されている場合、問題は、ECPosition が目の空間にあり、LightPosition と WCNormal がワールド空間にあることにあると考えました。これについて何かが正しくないようですが、私には理解できません。また、ECPosition をワールド空間に配置しようとしました。座標をワールド空間に取得するために行う変換のみを含む独自の modelMatrix を乗算しましたが、これは機能しませんでした。シェーダーまたはコードに関するその他の情報を提供する必要がある場合はお知らせください。