在實現着色器立方體貼圖之前,我嘗試使用六個紋理手動製作天空盒,但旋轉時出現扭曲。OpenGL爲什麼立方體貼圖會在環視時扭曲?
在GL 3.3使用立方體貼圖制服,是在那裏的場景(抵消失真)背後的一些數學加入魔法,對創建6個平坦面,並手動施加紋理每一側?
例
下面是使用六個獨立的紋理一個星空圖。您可以在立體角看到失真的場景旋轉
在實現着色器立方體貼圖之前,我嘗試使用六個紋理手動製作天空盒,但旋轉時出現扭曲。OpenGL爲什麼立方體貼圖會在環視時扭曲?
在GL 3.3使用立方體貼圖制服,是在那裏的場景(抵消失真)背後的一些數學加入魔法,對創建6個平坦面,並手動施加紋理每一側?
例
下面是使用六個獨立的紋理一個星空圖。您可以在立體角看到失真的場景旋轉
當然,立方體貼圖只能用一個90°視場創建(至少如果相機定位於立方體的中心) 。否則,你不會得到一個立方體。如果你減小fov,你會得到邊緣周圍的空白空間。如果你增加它,你會得到重疊的區域。您也可以創建一個非90°fov的長方體,但這不值得付出努力。
OpenGL中立方體貼圖的尋址模式與用於普通2D貼圖的模式不同。您可以使用2D紋理座標訪問2D紋理。立方體地圖通過3D方向矢量訪問。 OpenGL然後使用這個方向矢量來計算要使用的子紋理以及該子紋理的紋理座標。
天空盒也可以用六種簡單的紋理輕鬆實現。事實上,高級尋址模式甚至可能在這種情況下成爲缺點。如果您使用了不同的天空載體對象(例如,我曾經使用過一個sky tetrahedron),則會有所不同。如果發生扭曲,您的代碼中肯定會出現一些錯誤。基本原理起作用。
好吧,這是部分正確的。這裏關鍵的一點是,立方體面應該在概念上位於_infinite_距離。然後,相機的移動並不重要。通過可編程管線,事情變得更加容易。現在人們需要做的就是繪製一個全屏四邊形,並使用從攝影機位置到每個片段的方向矢量作爲立方體貼圖tex coords,這正好具有對立方體貼圖進行採樣的效果,就好像它在無窮遠處一樣,如[概述] [這裏](http://stackoverflow.com/questions/30015940/why-dont-people-use-tetrahedrons-for-skyboxes/30038392#30038392)。 – derhass