2011-07-12 27 views
9

我目前正在編程一個小型3D引擎,我想知道爲什麼我應該在片段着色器中進入眼圖座標。要做到這一點,我必須把我的相機矩陣放在一個統一的座標中來轉換光線位置,並使用camera_normal矩陣將光線方向放在眼睛座標中。 爲什麼大家都在使用這些座標?我真的沒有看到任何優勢,所以如果你能幫我理解這個選擇,我會很感激。 謝謝:)爲什麼要在OpenGL流水線的片段階段進入眼睛空間座標?

回答

7

有以下幾個原因眼空間的使用:

  1. 它的方便。這是一個存在的明確空間,也是您在轉換位置的過程中計算出來的空間。
  2. 它與世界空間的尺度相同,但沒有世界空間的問題。眼睛的空間總是(相對)接近零(因爲眼睛在0),所以這是一個明確的變換矩陣的合理空間。比例很重要,因爲您可以提供在世界空間中計算的距離(如光衰減項)。距離在眼睛空間中不會改變。
  3. 無論如何,您都需要將其轉換爲線性空間。在非投影空間這樣的非線性空間中進行照明,尤其是在縮放的情況下,照明是非常棘手的。所以你必須在某種線性空間中提供法線和位置,所以它也可能是眼睛空間。
  4. 它需要最少的轉換。眼部空間就是投影變換之前的空間。如果您必須逆向轉換爲線性空間(例如,延遲渲染),則眼圖空間是需要最少操作的空間。
4

您不必將相機矩陣提供給着色器,並在那裏進行光照位置和方向轉換。實際上,這樣做效率相當低,因爲您對每個頂點一次又一次地執行相同的操作。

只需轉換光源位置和方向CPU端,並將易於轉換的光參數提供給着色器。但是,照明計算在眼睛空間中仍然更加簡潔,尤其是在涉及法線貼圖的情況下。但是,無論如何,您必須將所有東西都轉換爲視覺空間,因爲法線不會被透視變換轉換(儘管頂點位置可以直接轉換爲剪輯空間)。

相關問題