2011-06-20 6 views
1

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

世界の空間は、まるで世界の空間です。あなたの仮想世界に存在するすべてのオブジェクトが存在する共通の空間です。世界空間の主な目的は、カメラ(または目)が配置できる共通空間を定義することです。

3DS MaxやBlenderなどのツールを使用しているメッシュからメッシュを作成した場合、ローカルスペースは一部のモデルスペースとも呼ばれます。法線は世界の空間と必ずしも同じではありません。

アイ・スペース(カメラ・スペースまたはビュー・スペースとも呼ばれます)は、基本的にワールド・スペースですが、すべてがカメラの位置と向きに関連しています。あなたがワールド空間でカメラを動かすと、あなたは本当に世界からアイへの空間変換を変えるだけです。目の空間のカメラは常に原点にあります。

個人的には、Lighthouse3Dチュートリアルの人々が怠け者になっているという印象を受けます。あなたの頂点の法線がワールド空間にあるという状況は希であり、法線だけでなく位置も変換しなければならないことを示していません(これはftransform()のものでした)。

チュートリアルは、ワールド空間とワールド空間で通常の方向があり(ポイントライトではなく指向性照明を行っている場合)、トランスフォームする必要はない何でも法線を変換する目的は、それをローカル空間からあなたの光の方向と同じ空間に変換することです。ここでは、それらは同じ空間内にあると定義するだけです。

実際には、実際のユーザーは、頂点の法線がローカル以外の空間にあると定義するのは贅沢ではありません。だから彼らはそれらを変えなければなりません。

最後に、モデルビューマトリックスを法線ベクトルに適用しないと、法線が実際のサーフェスの方向とは異なる方向を指していないでしょうか?

誰が気にしますか?重要なことは、両方の方向が同じ空間にあることだけです。その空間が頂点位置の空間と同じ空間であるかどうかは関係ありません。グラフィックスを広げるにつれ、ライティングに便利なスペースは、ポジションを変換するスペースではないことがあります。

これは問題ありません。照明方程式は、光と表面法線に向かう方向しか取らないためです。あなたが点照明をしていない限り、位置は取られません。そして、その位置は、光の方向と減衰係数を計算できる限り有用です。あなたは、光の方向を取って、あなたが望むどんな空間にでも変換することができます。

ローカルスペースで照明する人もいます。バンプマッピングを行っている場合は、テクスチャの平面に接する空間で照明を行いたいことがよくあります。


補遺:

(あなたの行列すべてがまだのOpenGLの標準行列コマンドを通ってくると仮定して)法線を処理するための標準的な方法は、法線は自分の位置データと同じ空間であると仮定することです。したがって、彼らも変身する必要があります。

しかし、better explained here,(注:完全な開示のため、私はそのページを書いています)のために、あなたはポジションに使用するマトリックスで法線を変換することはできません。幸いにも、OpenGLはそれを期待して書かれていたので、標準のOpenGLマトリックススタックを使用している場合は、これを扱うための定義済みの行列を与えます:gl_NormalMatrix

GLSLにおける典型的な照明シナリオは次のようになります。

uniform vec3 eyeSpaceLightDir; 
varying float intensity; 

void main() 
{ 
    vec3 eyeSpaceNormal = gl_NormalMatrix * gl_Normal; 
    intensity = dot(eyeSpaceLightDir, eyeSpaceNormal); 
    gl_Position = ftransform; 
} 

は、私はそれが何が起こっているのかは明らかだように、彼らが何であるかのスペース述べるために私の変数名を前書きすることを好む傾向にあります。

+0

ありがとうございます。しかし、私は最後の質問に対するあなたの答えについてはまだ不明です.3つの頂点を指定して平面を描くとしましょう。各頂点について、法線を指定します。次に、その平面上で回転を実行します。頂点シェーダを記述するとき、頂点に回転を適用するには、関数ftransform()を使用します。同時に、法線を正しく回転させる必要がありますか?彼らが正しい方向を指すように。それではどうしますか? – Einiosaurus

+0

@Einiosaurus:平面に適用する回転は、局所的に変換する(技術的には局所的に)変換の一部になります。 Lighthouse3Dのチュートリアルでは、法線が既にワールド空間にあることを期待しています。したがって、シェーダの前提を壊すことなくフラットプレーンにローテーションを適用することはできません。要するに、このチュートリアルのシェーダーでは、あなたが示唆していることは許可されていません。彼らは単に問題を離れて定義するだけで、私は彼らが怠け者だと言ったのです。 –

+0

はい!私はあなたのことを理解しています。しかし、私が求めているのは、チュートリアルで定義している問題の解決策です。法線がまだワールドスペースにないと仮定し、それを変形しなければならない場合、頂点シェーダで法線をどのように変換できるか知っていますか? – Einiosaurus

関連する問題