2015-09-13 81 views
0

在實現着色器立方體貼圖之前,我嘗試使用六個紋理手動製作天空盒,但旋轉時出現扭曲。OpenGL爲什麼立方體貼圖會在環視時扭曲?

在GL 3.3使用立方體貼圖制服,是在那裏的場景(抵消失真)背後的一些數學加入魔法,對創建6個平坦面,並手動施加紋理每一側?


下面是使用六個獨立的紋理一個星空圖。您可以在立體角看到失真的場景旋轉 frame 1 frame 2 frame 3

回答

0

在3D建模應用程序上進行設置並做了一些實驗後,我覺得我可以回答自己的問題。

立方體貼圖僅適用於第一人稱視角。重要的是眼睛/相機恰好位於立方體的中心,並且相機目標正在旋轉。 例如: Eye at center

在目標是否正好位於中心,並(在3D建模應用程序等)周圍的眼軌道的反向方案則立方體貼圖變成由失真無用。 例如: target at center

所以...回答這個問題。不,GLSL立方體貼圖背後沒有任何魔法可以防止發生失真。這完全取決於應用程序如何處理其相機系統。

+0

好吧,這是部分正確的。這裏關鍵的一點是,立方體面應該在概念上位於_infinite_距離。然後,相機的移動並不重要。通過可編程管線,事情變得更加容易。現在人們需要做的就是繪製一個全屏四邊形,並使用從攝影機位置到每個片段的方向矢量作爲立方體貼圖tex coords,這正好具有對立方體貼圖進行採樣的效果,就好像它在無窮遠處一樣,如[概述] [這裏](http://stackoverflow.com/questions/30015940/why-dont-people-use-tetrahedrons-for-skyboxes/30038392#30038392)。 – derhass

0

當然,立方體貼圖只能用一個90°視場創建(至少如果相機定位於立方體的中心) 。否則,你不會得到一個立方體。如果你減小fov,你會得到邊緣周圍的空白空間。如果你增加它,你會得到重疊的區域。您也可以創建一個非90°fov的長方體,但這不值得付出努力。

OpenGL中立方體貼圖的尋址模式與用於普通2D貼圖的模式不同。您可以使用2D紋理座標訪問2D紋理。立方體地圖通過3D方向矢量訪問。 OpenGL然後使用這個方向矢量來計算要使用的子紋理以及該子紋理的紋理座標。

天空盒也可以用六種簡單的紋理輕鬆實現。事實上,高級尋址模式甚至可能在這種情況下成爲缺點。如果您使用了不同的天空載體對象(例如,我曾經使用過一個sky tetrahedron),則會有所不同。如果發生扭曲,您的代碼中肯定會出現一些錯誤。基本原理起作用。

相關問題