5

というわけで、OpenGL 学習クエストで基本的なライティングにたどり着きました。

この最も単純な照明モデルを想像してみてください。各頂点には、位置、色、および法線があります。シェーダーは、ModelViewProjection マトリックス ( MVP )、Modelview マトリックス ( MV ) 、法線マトリックス ( N ) を(MV -1 ) Tとして計算し、ユニフォームとしてLightColorLightDirectionを取得します。頂点シェーダーはライティングの計算を実行し、フラグメント シェーダーは補間された色を出力するだけです。

さて、私が遭遇したこの主題に関するすべてのチュートリアルで、私を困惑させる 2 つのことがわかります。まず、LightDirectionはすでに目の座標にあると想定されています。次に、出力カラーは次のように計算されます。

max(0, dot(LightDirection, N * normal))*LightColor*Color;

最初にLightDirectionを逆にする必要があると思います。つまり、正しい式は次のようになります。

max(0, dot(-LightDirection, N * normal))*LightColor*Color;

LightDirectionは、実際のライト フローのベクトルの逆であると想定されているようです。

Q1: このモデルのLightDirectionが、光の方向のベクトルではなく、無限遠の光源へのベクトルであると想定されているのは、ある種の確立された慣例ですか? それとも、これは主要な問題ではなく、たまたま私が出会ったチュートリアルはとても想定されていましたか?

Q2: LightDirection が目の座標ではなくワールド座標にある場合、通常のマトリックスまたはモデルビュー マトリックスで目の座標に変換する必要がありますか?

これらのことを明確にしていただきありがとうございます!

4

2 に答える 2

2

Q1: このモデルの LightDirection が、光の方向のベクトルではなく、無限遠の光源へのベクトルであると想定されていることは、ある種の確立された慣例ですか? それとも、これは主要な問題ではなく、たまたま私が出会ったチュートリアルはとても想定されていましたか?

固定関数の OpenGL では、ライトの位置を指定するときに、4 番目のパラメータでライトが指向性か位置かを決定していました。ディレクショナル ライトの場合、指定されたベクトルは (無限に遠い) 光源を指します。

位置光源の場合、LightDirection は次のように頂点ごとに計算されます。LightDirection = LightPosition - VertexPosition簡単にするために、この計算は目の座標で行われます。

Q2: LightDirection が目の座標ではなくワールド座標にある場合、通常のマトリックスまたはモデルビュー マトリックスで目の座標に変換する必要がありますか?

固定関数の OpenGL では、提供されたライトの位置glLightiは、呼び出し時の現在のモデルビュー マトリックスによって変換されました。ライトが位置の場合、通常のモデル ビュー マトリックスによって変換されます。ディレクショナル ライトの場合、法線マトリックスが使用されました。

于 2011-09-05T15:55:53.067 に答える
1

これは、このモデルの LightDirection が、光の方向のベクトルではなく、無限遠の光源へのベクトルであると想定されるという確立された規則のようなものですか、それともこれは主要な問題ではなく、たまたまチュートリアルで私が出くわしたので、想定されていましたか?

ない。単に複数の種類のライトがあります。

ディレクショナル ライトは、シーンの視点から無限に離れた光源を表します。これはベクトル方向で表されます。

位置ライトは、シーンの空間内の位置を持つ光源を表します。これはベクトル位置で表されます。

どちらを使用するかは、シェーダーの照明モデル次第です。実際、ディレクショナル ライトと複数のポイント ライトを使用して、すべて同じモデルに影響を与えることができます。それはあなた次第です。

ご覧になったチュートリアルでは、単にディレクショナル ライトを使用していました。おそらく、少なくともディレクショナル ライトの近似について言及する必要があったでしょう。

LightDirection が目の座標ではなくワールド座標にある場合、通常のマトリックスまたはモデルビュー マトリックスで目の座標に変換する必要がありますか?

ない。ライトの方向がワールド座標にある場合は、法線もワールド座標に取得する必要があります。どの空間でライティングを行うかは問題ではありません (ただし、クリップ空間やその他の非線形の射影後の空間で行うのはかなり困難です)。重要なのは、すべてが同じ空間にあるということです。

デフォルトの OpenGL モデルビュー マトリックスは、モデル空間からビュー空間 (目の空間) に移動します。ワールド空間を通過しますが、そこで止まりません。また、デフォルトの OpenGL 法線行列は、モデルビュー 行列の逆転置にすぎません。したがって、どちらもあなたを世界空間に連れて行くことはありません。

一般に、他の場所で最もよく説明されている理由により、ワールド空間でライティング (または GPU 上のその他のこと) を行うべきではありません。ワールド空間でライティングを行うには、ワールド空間に変換するマトリックスが必要です。私の提案は、それを正しく行うことです。ライトの方向を目の空間に置き、ワールド空間を CPU コードに任せます。

于 2011-09-05T16:42:39.593 に答える