我目前正在編程一個小型3D引擎,我想知道爲什麼我應該在片段着色器中進入眼圖座標。要做到這一點,我必須把我的相機矩陣放在一個統一的座標中來轉換光線位置,並使用camera_normal矩陣將光線方向放在眼睛座標中。 爲什麼大家都在使用這些座標?我真的沒有看到任何優勢,所以如果你能幫我理解這個選擇,我會很感激。 謝謝:)爲什麼要在OpenGL流水線的片段階段進入眼睛空間座標?
9
A
回答
7
有以下幾個原因眼空間的使用:
- 它的方便。這是一個存在的明確空間,也是您在轉換位置的過程中計算出來的空間。
- 它與世界空間的尺度相同,但沒有世界空間的問題。眼睛的空間總是(相對)接近零(因爲眼睛在0),所以這是一個明確的變換矩陣的合理空間。比例很重要,因爲您可以提供在世界空間中計算的距離(如光衰減項)。距離在眼睛空間中不會改變。
- 無論如何,您都需要將其轉換爲線性空間。在非投影空間這樣的非線性空間中進行照明,尤其是在縮放的情況下,照明是非常棘手的。所以你必須在某種線性空間中提供法線和位置,所以它也可能是眼睛空間。
- 它需要最少的轉換。眼部空間就是投影變換之前的空間。如果您必須逆向轉換爲線性空間(例如,延遲渲染),則眼圖空間是需要最少操作的空間。
4
您不必將相機矩陣提供給着色器,並在那裏進行光照位置和方向轉換。實際上,這樣做效率相當低,因爲您對每個頂點一次又一次地執行相同的操作。
只需轉換光源位置和方向CPU端,並將易於轉換的光參數提供給着色器。但是,照明計算在眼睛空間中仍然更加簡潔,尤其是在涉及法線貼圖的情況下。但是,無論如何,您必須將所有東西都轉換爲視覺空間,因爲法線不會被透視變換轉換(儘管頂點位置可以直接轉換爲剪輯空間)。
相關問題
- 1. 爲什麼我的FaceDetectionListener無法檢測到眼睛座標
- 2. 慶典 - 在一個流水線階段
- 3. VHDL MIPS 5階段流水線Bug
- 4. 哪個座標空間是每個着色器流水線階段的規範默認值?
- 5. OpenGL流水線中的剪裁空間
- 6. OpenGL中的眼睛糖果
- 7. 在golang中,如何編寫一個流水線階段,爲下一階段引入延遲?
- 8. OpenGL:從GLSL中的窗口空間座標計算眼圖座標?
- 9. C++同步的階段,多線程流水線
- 10. 在流水線階段MongoDB的錯誤對象
- 11. 將光世界空間座標轉換爲眼圖座標
- 12. 經典RISC流水線 - 「內存訪問」階段實際上做了什麼?
- 13. Jenkins:無法在流水線階段定義變量
- 14. 在什麼階段印刷sed的圖案空間?
- 15. Kineticjs階段縮放後的座標
- 16. Mongo 2.6.1 - 無法識別的流水線階段名稱:'$ out'
- 17. 「errmsg」:「無法識別的流水線階段名稱:'$ graphLookup'」mongodb上
- 18. 爲什麼這個片段的字段爲空?
- 19. 瞭解CPU流水線階段與指令吞吐量
- 20. 英特爾酷睿i7有多少個流水線階段?
- 21. Jenkins流水線階段 - 傳遞整個文件
- 22. 如何測試CI/CD流水線階段?
- 23. Eclipse進入調試階段
- 24. 進入測試階段
- 25. 動畫片段座標
- 26. 片段中的視圖座標始終爲空
- 27. Bluemix:如何配置交付流水線階段構建以標記git?
- 28. 爲什麼使用.bluemix/pipeline.yml文件階段指令的IBM Bluemix DevOps流水線階段僅在部署克隆項目時才添加?
- 29. 爲什麼進程在不同階段加載模塊(dll)?
- 30. 與詹金斯工作流程/流水線並行運行的階段