CubeMap天空盒的方向與調整

2021-09-29 01:45:33 字數 3196 閱讀 6566

(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張可以連線縫合的天空,貼圖到乙個立方體...