我通過a tutorial on the Web瞭解GLSL。爲什麼不將模型視圖矩陣應用於香椿着色中的法向量(Lighthouse3d教程)?
的教程有稱爲卡通着色的例子。 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?
我希望我做我的問題說清楚。
謝謝!
謝謝你的回答。但是,對於最後一個問題,我還不清楚你的答案。比方說,你通過指定三個頂點繪製一個平面。對於每個頂點,您指定一個法線。然後,您在該平面上執行旋轉。在編寫頂點着色器時,爲了在頂點上應用旋轉,可以使用函數ftransform()。同時,你也必須旋轉法線嗎?以便他們指出正確的方向。那麼你怎麼做? (即在法線上應用模型視圖矩陣) – Einiosaurus
@Einiosaurus:您應用於平面的旋轉將成爲本地到世界變換(技術上本地到眼睛)的一部分。 Lighthouse3D教程期望法線已經處於世界空間。因此,在不破壞着色器的假設的情況下,不允許你在平面上應用旋轉。簡而言之,本教程的着色器不允許您提出的建議。他們只是簡單地將問題確定下來,這就是爲什麼我說他們很懶惰。 –
是的!我明白你的觀點。但是,我所要求的是解決教程定義的問題。假設法線不在世界空間中,我們必須改變它,你知道我們如何能夠在頂點着色器中轉換法線嗎? – Einiosaurus