というわけで、OpenGL 学習クエストで基本的なライティングにたどり着きました。
この最も単純な照明モデルを想像してみてください。各頂点には、位置、色、および法線があります。シェーダーは、ModelViewProjection マトリックス ( MVP )、Modelview マトリックス ( MV ) 、法線マトリックス ( N ) を(MV -1 ) Tとして計算し、ユニフォームとしてLightColorとLightDirectionを取得します。頂点シェーダーはライティングの計算を実行し、フラグメント シェーダーは補間された色を出力するだけです。
さて、私が遭遇したこの主題に関するすべてのチュートリアルで、私を困惑させる 2 つのことがわかります。まず、LightDirectionはすでに目の座標にあると想定されています。次に、出力カラーは次のように計算されます。
max(0, dot(LightDirection, N * normal))*LightColor*Color;
最初にLightDirectionを逆にする必要があると思います。つまり、正しい式は次のようになります。
max(0, dot(-LightDirection, N * normal))*LightColor*Color;
LightDirectionは、実際のライト フローのベクトルの逆であると想定されているようです。
Q1: このモデルのLightDirectionが、光の方向のベクトルではなく、無限遠の光源へのベクトルであると想定されているのは、ある種の確立された慣例ですか? それとも、これは主要な問題ではなく、たまたま私が出会ったチュートリアルはとても想定されていましたか?
Q2: LightDirection が目の座標ではなくワールド座標にある場合、通常のマトリックスまたはモデルビュー マトリックスで目の座標に変換する必要がありますか?
これらのことを明確にしていただきありがとうございます!