2013-07-06 50 views
6

我正在學習OpenGL圖形,並且正在進入陰影。我正在閱讀的教程告訴我將法線和光矢量轉換爲相機空間。爲什麼是這樣?你爲什麼不能在模型空間中保留這些座標?爲什麼使用相機空間而不是模型空間進行法線?

後續問題是如何處理模型轉換。我無法找到明確的答案。我目前有這樣的代碼:

vec3 normCamSpace = normalize(mat3(V) * normal);" 
vec3 dirToLight = (V*vec4(lightPos, 0.0)).xyz;" 
float cosTheta = clamp(dot(normCamSpace, dirToLight),0,1);" 

V是視圖矩陣或攝像機矩陣。當模型在位置,旋轉和比例上發生變化時,我不確定如何移動或編輯燈光。

回答

7

主要原因是,通常你的燈光位置不會在模型空間中給出,而是在世界空間中給出。然而,爲了使照明有效地工作,所有計算必須在共同的空間中進行。在你平時的變換鏈,模型局部座標由模型視圖矩陣直接轉化視野空間

p_view = MV · p_local 

既然你通常只有一個模型視圖矩陣它會很麻煩這個STEAP分成類似

p_world = M · p_local 
p_view = V · p_world 

因爲你要求MV被分開。

由於投影變換傳統上是作爲一個單獨的步驟發生的,所以視圖空間是在其上進行照明計算所依據的自然「公共底層」。它只涉及將光源位置從世界轉換到視圖空間,並且由於光照位置並不十分複雜,因此在CPU上執行此操作,並將預先轉換後的光照位置作爲着色器提供。

注意沒有什麼阻止你在世界空間或模型局部空間進行照明計算。它只是正確地轉換光線位置。

+0

好吧,這是有道理的,雖然我確實有這種級別的分離。然而,我仍然不確定如何改變光源和位置,以便適應旋轉和翻譯等事情。 – user975989

+0

規範的方法是轉換光的位置,就像轉換頂點位置一樣。如果聚光燈(您需要點光源方向),則可以像改變法線一樣轉換光點方向。對於空間之間的每個變換矩陣(這也適用於從例如世界到模型局部的變換),正常變換總是位置變換的逆轉置。 – datenwolf

0

我在學習OpenGL圖形,並且正在進入陰影。我正在閱讀的教程告訴我將法線和光矢量轉換爲相機空間。爲什麼是這樣?你爲什麼不能在模型空間中保留這些座標?

其實如果你是寫着色器的人,你可以使用任何你想要的座標空間。在世界空間計算照明的IMO感覺更「自然」,但這是品味的問題。

然而,有兩個小細節:

  1. 你不能「自然」計算對象空間照明,如果你的對象是一個蒙皮網格(由骨骼動畫人物模型)。這種模式將需要世界空間或視野空間。如果您的對象只能被轉換和旋轉(僅仿射變換),那麼可以在模型/對象空間中輕鬆計算照明。我認爲一些遊戲引擎實際上是這樣工作的。
  2. 如果使用相機空間,則可以在計算鏡面高光時放下一個減法。 Blinn/phong鏡面模型需要向(或來自)眼睛的矢量來計算鏡面反射因子。在相機空間中,從眼點到點的矢量等於點位置。這是一個非常小的優化,可能不值得付出努力。
相關問題