原因
出現(xiàn)ZFighting閃爍問題的原因是因?yàn)?,我們打開深度測試后,OpenGL就不會(huì)繪制模型背遮擋的部分,但是由于深度緩沖區(qū)的精度限制,假如兩個(gè)兩者深度非常接近的時(shí)候,OpenGL 就無法正確判斷出兩者的深度值,會(huì)導(dǎo)致渲染的結(jié)果無法預(yù)測,顯示出來的圖像交錯(cuò)閃爍。(如下圖時(shí)而渲染出綠色,時(shí)而渲染出紅色,無法確定,交錯(cuò)閃爍)

ZFighting閃爍

ZFighting閃爍
問題解決
第一步:啟?用 Polygon Offset ?方式解決
解決?法: 讓深度值之間產(chǎn)生間隔.在執(zhí)行深度測試前將立方體的深度值做一些細(xì)微的增加.于是就能將重疊的2個(gè)圖形深度值之間有所區(qū)分
//啟用Polygon Offset
glEnable(GL_POLYGON_OFFSET_FILL)
參數(shù)列表:
GL_POLYGON_OFFSET_POINT
GL_POLYGON_OFFSET_LINE
GL_POLYGON_OFFSET_FILL
第二步:指定偏移量
void glPolygonOffset(Glfloat factor,Glfloat units);
應(yīng)?到片段上總偏移計(jì)算?方程式:
Depth Offset = (DZ * factor) + (r * units); DZ:深度值(Z值)
r:使得深度緩沖區(qū)產(chǎn)生變化的最小值
負(fù)值,將使得z值距離我們更近,而正值,將使得z值距離我們更遠(yuǎn),我們?cè)O(shè)置factor和units設(shè)置為-1,-1
第三步: 關(guān)閉Polygon Offset
glDisable(GL_POLYGON_OFFSET_FILL)
問題預(yù)防
- 不要將兩個(gè)物體靠的太近,避免渲染時(shí)三角形疊在?一起。這種方式要求對(duì)場景中物體插入一個(gè)少量的偏移,那么就可能避免ZFighting現(xiàn)象。例如??體和平面問題中,將平面下移0.001f就可以解決這個(gè)問題。當(dāng)然?動(dòng)去插入這個(gè)小的偏移是要付出代價(jià)的。
- 盡可能將近裁剪?設(shè)置得離觀察者遠(yuǎn)一些。盡可能讓近裁剪?遠(yuǎn)一些的話,會(huì)使整個(gè)裁剪范圍內(nèi)的精確度變高一些。但是這種方式會(huì)使離觀察者較近的物體被裁減掉,因此需要調(diào)試好裁剪面參數(shù)
- 離觀察者較近的物體被裁減掉,因此需要調(diào)試好裁剪面參數(shù)。 使用更高位數(shù)的深度緩沖區(qū),通常使用的深度緩沖區(qū)是24位的,現(xiàn)在有一些硬件使用32位的緩沖區(qū),使精確度得到提?