1、深度
所謂深度,就是在openGL坐標(biāo)系中,像素點(diǎn)Z坐標(biāo)距離攝像機(jī)的距離。攝像機(jī)可能放在坐標(biāo)系的任何位置,那么,就不能簡(jiǎn)單的說(shuō)Z數(shù)值越大或越小,就是越靠近攝像機(jī)。
2、深度緩沖區(qū)
深度緩沖區(qū)原理就是把一個(gè)距離觀察平面(近裁剪面)的深度值(或距離)與窗口中的每個(gè)像素相關(guān)聯(lián)。
首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值設(shè)置為最大值(一般是遠(yuǎn)裁剪面)。
然后,在場(chǎng)景中以任意次序繪制所有物體。硬件或者軟件所執(zhí)行的圖形計(jì)算把每一個(gè)繪制表面轉(zhuǎn)換為窗口上一些像素的集合,此時(shí)并不考慮是否被其他物體遮擋。
其次,OpenGL會(huì)計(jì)算這些表面和觀察平面的距離。如果啟用了深度緩沖區(qū),在繪制每個(gè)像素之前,OpenGL會(huì)把它的深度值和已經(jīng)存儲(chǔ)在這個(gè)像素的深度值進(jìn)行比較。新像素深度值<原先像素深度值,則新像素值會(huì)取代原先的;反之,新像素值被遮擋,他顏色值和深度將被丟棄。
為了啟動(dòng)深度緩沖區(qū),必須先啟動(dòng)它,即glEnable(GL_DEPTH_TEST)。每次繪制場(chǎng)景之前,需要先清除深度緩沖區(qū),即glClear(GL_DEPTH_BUFFER_BIT),然后以任意次序繪制場(chǎng)景中的物體。
數(shù)學(xué)基礎(chǔ):
待渲染的照相機(jī)空間中的深度經(jīng)常定義為近距 near 到遠(yuǎn)距 far 之間的 z 值,Z坐標(biāo)和X、Y坐標(biāo)一樣。在變換、裁減和透視除法后,Z的范圍為-1.0~1.0。DepthRange映射指定Z坐標(biāo)的變換,這與用于將X和Y映射到窗口坐標(biāo)的視口變換類似,在透視變換之后,得到新的 z' 值:
其中 z 是照相機(jī)空間的值,它有時(shí)候也表示為 w 或者 w'。
結(jié)果 z' 是在 -1 到 1 之間歸一化之后的值,其中近距 near 平面位于 -1 處,遠(yuǎn)距 far 平面位于 1 處。在這個(gè)范圍之外的相應(yīng)點(diǎn)在視圖體之外,不需要進(jìn)行渲染。
為了實(shí)現(xiàn)深度緩沖,在整個(gè)屏幕空間上的對(duì)當(dāng)前多邊形頂點(diǎn)之間進(jìn)行插值來(lái)計(jì)算 z' 的值,通常這些中間數(shù)值在深度緩沖區(qū)中用定點(diǎn)數(shù)格式保存。距離近距 near 平面越近,z' 值越密;距離越遠(yuǎn),z' 值越稀。這樣距離照相機(jī)越近精度越高。near 平面距離照相機(jī)越近,則遠(yuǎn)距離位置的精度越低。near 平面距離照相機(jī)太近是在遠(yuǎn)距離物體產(chǎn)生人為誤差的一個(gè)常見因素。
3、深度測(cè)試
OpenGL中的深度測(cè)試是采用深度緩存器算法,消除場(chǎng)景中的不可見面。在默認(rèn)情況下,深度緩存中深度值的范圍在0.0到1.0之間,這個(gè)范圍值可以通過(guò)函數(shù):glDepthRange (nearNormDepth, farNormalDepth);將深度值的范圍變?yōu)閚earNormDepth到farNormalDepth之間。這里nearNormDepth和farNormalDepth可以取0.0到1.0范圍內(nèi)的任意值,甚至可以讓nearNormDepth > farNormalDepth。這樣,通過(guò)glDepthRange函數(shù)可以在透視投影有限觀察空間中的任意區(qū)域進(jìn)行深度測(cè)試。
另一個(gè)非常有用的函數(shù)是:glClearDepth (maxDepth);參數(shù)maxDepth可以是0.0到1.0范圍內(nèi)的任意值。glClearDepth用maxDepth對(duì)深度緩存進(jìn)行初始化,而默認(rèn)情況下,深度緩存用1.0進(jìn)行初始化。由于在進(jìn)行深度測(cè)試中,大于深度緩存初始值的多邊形都不會(huì)被繪制,因此glClearDepth函數(shù)可以用來(lái)加速深度測(cè)試處理。這里需要注意的是指定了深度緩存的初始化值之后,應(yīng)調(diào)用: glClear(GL_DEPTH_BUFFER_BIT); 完成深度緩存的初始化。
在深度測(cè)試中,默認(rèn)情況是將需要繪制的新像素的z值與深度緩沖區(qū)中對(duì)應(yīng)位置的z值進(jìn)行比較,如果比深度緩存中的值小,那么用新像素的顏色值更新幀緩存中對(duì)應(yīng)像素的顏色值。這種比較測(cè)試的方式可以通過(guò)函數(shù):glDepthFunc(func);進(jìn)行修改。其中參數(shù)func的值可以為GL_NEVER(沒有處理)、GL_ALWAYS(處理所有)、GL_LESS(小于)、GL_LEQUAL(小于等于)、GL_EQUAL(等于)、GL_GEQUAL(大于等于)、GL_GREATER(大于)或GL_NOTEQUAL(不等于),其中默認(rèn)值是GL_LESS。這些測(cè)試可以在各種應(yīng)用中減少深度緩存處理的的計(jì)算。
-
OpenGL
+關(guān)注
關(guān)注
1文章
86瀏覽量
29706 -
緩存器
+關(guān)注
關(guān)注
0文章
63瀏覽量
11832
原文標(biāo)題:OpenGL中的深度、深度緩存、深度測(cè)試
文章出處:【微信號(hào):Imgtec,微信公眾號(hào):Imagination Tech】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論