(owed by: 春夜喜雨
討論天空盒之前, 先明確下座標系:
對於view投影座標系, opengl與direct採用了不同的座標系, opengl採用的view座標系(右手座標系)-y-up座標系的front為-z(negtive z), direct採用的view座標系(左手座標系)-y-up座標系的front為+z(postive z).
天空盒6張組裝盒子時, 均以front為中心進行的組裝.
top
left front right back
bottom
下面討論的基礎以front為-z方向進行討論(如果是front為+z情況,需要反轉+z/-z的位置);
另外不考慮flip-y的情況(flip-y情況-所有方向顛倒, 的top/bottom放置需要置換, 例如盒子倒過來後, 上面的蓋子要移到下面)
對於cubemap來說,構造乙個完整的cubemap的基本**為:
a. 先建立乙個紋理,並繫結為texture_cube_map型別紋理
b. 為cube紋理設定前後左右上下的貼圖
var texture = gl.
createtexture()
;gl.
activetexture
(gl.
texture0);
gl.bindtexture
(gl.
texture_cube_map
, texture)
;gl.
teximage2d
(gl.
texture_cube_map_negative_z,0
,...
, datafront)
;gl.
teximage2d
(gl.
texture_cube_map_postive_z,0
,...
, databack)
;gl.
teximage2d
(gl.
texture_cube_map_negative_x,0
,...
, dataleft)
;gl.
teximage2d
(gl.
texture_cube_map_postive_x,0
,...
, dataright)
;gl.
teximage2d
(gl.
texture_cube_map_postive_y,0
,...
, datatop)
;gl.
teximage2d
(gl.
texture_cube_map_negative_y,0
,...
, databottom)
;
可以看到:
前對應的-z軸,後對應+z軸,左對應-x軸,右對應+x軸,上對應正y軸,下對應-y軸
gl_texture_cube_map_negative_z front
gl_texture_cube_map_positive_z back
gl_texture_cube_map_negative_x left
gl_texture_cube_map_positive_x right
gl_texture_cube_map_positive_y top
gl_texture_cube_map_negative_y bottom
這個是著名的y-up座標系,和model-view-projection的view-camera座標系很相似,+y指向相機的上方向,-z指向鏡頭觀察的方向,x+指向相機的右側方向。
特別需要關注的是,的連線方式:
我們都知道這六張圖要拼接成乙個正方體,圖與圖之間是要連線到一塊的;
但是如何連線,以那張圖為中心連線,這會決定了的上方向是否需要調整;正常情況以front作為連線的中心,但例如改為以bottom底部作為連線的中心,那麼左右側的連線邊就會和變化,從而導致需要旋轉90度/-90度才能連線上。
下面是連線方式經典的圖形:以front為中心連線其它的
----------- t o p -------------
left -> front ->right
-----------bottom------------
(back放在top上/bottom下/left左/right右 均可)
作為天空盒時,需要具備天空盒的一些特點,如始終在天空盒的內部,天空盒的方向穩定。
已知:view投影矩陣把世界座標系轉換到以相機點為中心,-z指向相機觀察方向,+y指向相機上方向;
實現:相機放在cubemap的中心位置
我們希望時鐘把相機放在cubemap的中心位置,那麼可以在skybox的的vertex著色器中,僅保留相機view矩陣的旋轉量作為skybox的view矩陣,從而讓相機可以旋轉觀察cubemap內部。
實現:skybox方向固定
盒子的位置固定,主要是取樣資訊的固定,取樣座標使用skybox的點座標,相機的取樣點和skybox的原始點統一,保證固定點的取樣值時鐘不變,skybox方向固定。
attribute vec3 a_pos;
varying vec3 v_coord;
uniform mat4 viewrotate;
void main()
cubemap的座標系是y-up;建立模型時通常建立的z-up的模型座標系,場景中我們也經常使用z-up的場景座標系;
cubemap實現的是y-up,以front為中心連線各個,front指向-z。
要實現:使用z-up座標取樣到天空盒
對於天空盒的旋轉,我們可以考慮幾種做法來調整cubemap取樣的方向:
修改天空盒的**,front(-z)放bottom,其它,修改方向,匹配連線到bottom上。這樣,對應的為z-up結構。
修改viewrotate旋轉量,z-up與y-up的轉換,可以以x軸為中心旋轉90度得到,為viewrotate新增上該旋轉量,從而取樣時調整方向取樣。
修改取樣座標值,盒子不變的情況下,把取樣座標值調整90度,從而上方取樣到y軸。
(owed by: 春夜喜雨
C opengl 天空盒的建立
天空盒要處在最遠處,任何東西都可以遮擋天空盒,而天空盒不能去遮擋任何東西。根據深度緩衝區 清空深度快取區預設是1.0 白色 如果是在視野範圍內,那麼他的深度緩衝區會寫上最近一次物體的深度資訊,深度緩衝區就會發生變化 深度緩衝區會被重新整理 如果又有物體,他的深度緩衝區的值比剛剛的小,就繪製出來,並且...
QT與OpenGL結合實現天空盒
之前搗鼓過一段時間opengl,用的是glad加上glfw庫,由於在windows下c 開發用qt較多,所以把qt和opengl結合,因此進行了嘗試。首先qt5.8.0下有自帶的opengl控制項opengl widget,將這個控制項提公升為乙個自己寫的類myopenglbox繼承於qopengl...
關於OpenGL的天空盒的理解
參考 owed by 春夜喜雨 關於天空盒 空間概念上 可以理解為乙個盒子,內壁貼著貼圖,我們位於盒子內,盒子離我們無窮遠。我們抬頭向四面看,最遠處是這個盒子的內壁,由於我們始終位於盒子內,所以我們不會看到盒子以外的部分。opengl實現上 通常是 天空盒採用6張可以連線縫合的天空,貼圖到乙個立方體...