a tutorial on the Webを経由してGLSLを学習しています。トーンシェーディング(Lighthouse3dチュートリアル)のノーマルベクタでモデルビューマトリックスを適用しないのはなぜですか?
チュートリアルにはToon Shadingという例があります。 Here is the link to Toon Shading - Version I。次のようにこの例では
は、頂点シェーダが書き込まれます。
uniform vec3 lightDir;
varying float intensity;
void main()
{
intensity = dot(lightDir,gl_Normal);
gl_Position = ftransform();
}
私の最高の理解するために、私は表面を回転させると、その表面の頂点の法線ベクトルも回転しなければならないことを知っています同じ量であるため、法線ベクトルはサーフェスの新しい方向を反映します。ただし、上記のコードでは、モデルビューマトリックスは法線ベクトルに適用されません。法線ベクトルは光強度を計算するために直接使用されます。私の懸念について
は、ここでのチュートリアルはこう言われる、
「光の方向をワールド空間で定義されていることを前提としています。」
と
ない回転またはスケールがOpenGLアプリケーションでモデル上で実行されていない場合」は、通常は、gl_Normalとして頂点シェーダに提供、ワールド空間で定義されたローカル空間で定義された正常と一致"私は私の質問は明らかにされ願う
1. What are world space and local space? How are they different? (This question
seems a little bit elementary, but I need to understand...)
2. I figure the fact that "the light’s direction is defined in world space"
has something to do with not applying the Model View Matrix on to the
normal vector of a vertex. But, what is that?
3. Finally, If we don't apply the Model View Matrix on the normal vector then
wouldn't the normal be pointing to a direction different from the actual
direction of the surface? How do we solve this problem?
:
これらの説明は私にいくつかの質問を提供します。
ありがとうございます!
ありがとうございます。しかし、私は最後の質問に対するあなたの答えについてはまだ不明です.3つの頂点を指定して平面を描くとしましょう。各頂点について、法線を指定します。次に、その平面上で回転を実行します。頂点シェーダを記述するとき、頂点に回転を適用するには、関数ftransform()を使用します。同時に、法線を正しく回転させる必要がありますか?彼らが正しい方向を指すように。それではどうしますか? – Einiosaurus
@Einiosaurus:平面に適用する回転は、局所的に変換する(技術的には局所的に)変換の一部になります。 Lighthouse3Dのチュートリアルでは、法線が既にワールド空間にあることを期待しています。したがって、シェーダの前提を壊すことなくフラットプレーンにローテーションを適用することはできません。要するに、このチュートリアルのシェーダーでは、あなたが示唆していることは許可されていません。彼らは単に問題を離れて定義するだけで、私は彼らが怠け者だと言ったのです。 –
はい!私はあなたのことを理解しています。しかし、私が求めているのは、チュートリアルで定義している問題の解決策です。法線がまだワールドスペースにないと仮定し、それを変形しなければならない場合、頂点シェーダで法線をどのように変換できるか知っていますか? – Einiosaurus