深度緩沖區(qū)的概念
- 深度其實就是該像素點在3D世界中距離攝像機的距離,Z值
- 深度緩存區(qū),就是一塊內(nèi)存區(qū)域,專門存儲著每個像素點(繪制在屏幕上的)深度值.深度值(Z值)越大,則離攝像機就越遠.
- 在不使用深度測試的時候,如果我們先繪制一個距離比較近的物體,再繪制距離較遠的物體,則距離遠的位圖因為后繪制,會把距離近的物體覆蓋掉如圖a所示.?有了深度緩沖區(qū)后,繪制物體的順序就不那么重要的.?實際上,只要存在深度緩沖區(qū),OpenGL?都會把像素的深度值寫入到緩沖區(qū)中.?除非調(diào)用glDepthMask(GL_FALSE).來禁止寫入.
深度測試
深度緩沖區(qū)(DepthBuffer)和顏?色緩存區(qū)(ColorBuffer)是對應(yīng)的.顏色緩存區(qū)存儲像素的顏色信息,而深度緩沖區(qū)存儲像素的深度信息.?在決定是否繪制一個物體表面時, 首先要將表面對應(yīng)的像素的深度值與當前深度緩沖區(qū)中的值進行比較.?如果大于深度緩沖區(qū)中的值,則丟棄這部分.否則 利用這個像素對應(yīng)的深度值和顏?色值.分別更新深度緩沖區(qū)和顏色緩存區(qū).?這個過程稱為”深度測試”。
- 深度緩沖區(qū),?一般由窗?口管理理系統(tǒng),GLFW創(chuàng)建.深度值?一般由16位,24位,32位值表示.?通常是24位.位數(shù)越高,深度精確度更好.
- 開啟深度測試:glEnable(GL_DEPTH_TEST);
- 在繪制場景前,清除顏?色緩存區(qū),深度緩沖glClearColor(0.0f,0.0f,0.0f,1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- 清除深度緩沖區(qū)默認值為1.0,表示最大的深度值,深度值的范圍為(0,1)之間.?值越小表示越靠近觀察者,值越大表示 越遠離觀察者
ZFighting閃爍問題
因為開啟深度測試后,OpenGL?就不會再去繪制模型被遮擋的部分.?這樣實現(xiàn)的顯示更加真實.但是由于深度緩沖區(qū)精度的限制對于深度相差非常小的情況下.(例如在同一平面上進行2次繪制),OpenGL?就可能出現(xiàn)不能正確判斷兩者的深度值,會導(dǎo)致深度測試的結(jié)果不可預(yù)測.顯示出來的現(xiàn)象出現(xiàn)交錯閃爍,如圖b所示
ZFighting閃爍問題問題解決
第一步:?啟用?Polygon Offset 方式解決
? ??????解決?方法:?讓深度值之間產(chǎn)?生間隔.如果2個圖形之間有間隔,是不不是意味著就不不會產(chǎn)?生? ? 干涉.可以理理 解為在執(zhí)?行行深度測試前將?立?方體的深度值做?一些細微的增加.于是就能將??疊的2個圖形深度值之 前有所區(qū)分.
//啟?用Polygon Offset 方式glEnable(GL_POLYGON_OFFSET_FILL)
參數(shù)列列表:?
GL_POLYGON_OFFSET_POINT ? ? ?對應(yīng)光柵化模式: GL_POINT
?GL_POLYGON_OFFSET_LINE ? ? ? ?對應(yīng)光柵化模式: GL_LINE
?GL_POLYGON_OFFSET_FILL ??
第二步:?指定偏移量
- 通過glPolygonOffset?來指定.glPolygonOffset?需要2個參數(shù): factor , units
- 每個Fragment?的深度值都會增加如下所示的偏移量量:Offset = ( m * factor ) + ( r * units);m : 多邊形的深度的斜率的最?大值,理理解?一個多邊形越是與近裁剪?面平?行行,m?就越接近于0.r :?能產(chǎn)?生于窗?口坐標系的深度值中可分辨的差異最?小值.r?是由具體是由具體OpenGL?平臺指定的 ?一個常量量.
- 一個大于0的Offset?會把模型推到離你(攝像機)更遠的位置,相應(yīng)的一個小于0的Offset?會把模型拉近
- 一般而言,只需要將-1.0?和?-1?這樣簡單賦值給glPolygonOffset?基本可以滿?足需求.
ZFighting閃爍問題預(yù)防
- 不要將兩個物體靠的太近奈应,避免渲染時三角形疊在一起。這種方式要求對場景中物體插入一個少量量的偏移贯涎,那么就可能避免ZFighting現(xiàn)象。例如上面的立方體和平面問題中慢洋,將平面下移0.001f就可以解決這個問題塘雳。當然?手動去插?入這個?小的偏移是要付出代價的。
- ?盡可能將近裁剪面設(shè)置得離觀察者遠一些普筹。上面我們看到粉捻,在近裁剪平面附近,深度的精確度是很?的斑芜,因此盡可能讓近裁剪?面遠一些的話肩刃,會使整個裁剪范圍內(nèi)的精確度變?一些。但是這種?方式會使離觀察者較近的物體被裁減掉,因此需要調(diào)試好裁剪?面參數(shù)盈包。
- 使?更高位數(shù)的深度緩沖區(qū)沸呐,通常使用的深度緩沖區(qū)是24位的,現(xiàn)在有一些硬件使用32位的緩沖 區(qū)呢燥,使精確度得到提高崭添。