OpenGL ZFighting閃爍

緣由

出現ZFighting閃爍問題的緣由是由於,咱們打開深度測試後,OpenGL就不會繪製模型背遮擋的部分,可是因爲深度緩衝區的精度限制,假如兩個二者深度很是接近的時候,OpenGL 就沒法正確判斷出二者的深度值,會致使渲染的結果沒法預測,顯示出來的圖像交錯閃爍。(以下圖時而渲染出綠色,時而渲染出紅色,沒法肯定,交錯閃爍) bash

ZFighting閃爍
ZFighting閃爍

問題解決

第一步:啓⽤用 Polygon Offset ⽅方式解決

解決⽅法: 讓深度值之間產生間隔.在執行深度測試前將立方體的深度值作一些細微的增長.因而就能將重疊的2個圖形深度值之間有所區分 //啓用Polygon Offset glEnable(GL_POLYGON_OFFSET_FILL) 參數列表: GL_POLYGON_OFFSET_POINT GL_POLYGON_OFFSET_LINE GL_POLYGON_OFFSET_FILL測試

第二步:指定偏移量
void glPolygonOffset(Glfloat factor,Glfloat units);

應⽤到片斷上總偏移計算⽅方程式:
Depth Offset = (DZ * factor) + (r * units); DZ:深度值(Z值)

r:使得深度緩衝區產生變化的最小值
負值,將使得z值距離咱們更近,而正值,將使得z值距離咱們更遠,咱們設置factor和units設置爲-1,-1
複製代碼
第三步: 關閉Polygon Offset

glDisable(GL_POLYGON_OFFSET_FILL)spa

問題預防

  • 不要將兩個物體靠的太近,避免渲染時三角形疊在⼀一塊兒。這種方式要求對場景中物體插入一個少量的偏移,那麼就可能避免ZFighting現象。例如⽴⽅體和平面問題中,將平面下移0.001f就能夠解決這個問題。固然⼿動去插入這個小的偏移是要付出代價的。
  • 儘量將近裁剪⾯設置得離觀察者遠一些。儘量讓近裁剪⾯遠一些的話,會使整個裁剪範圍內的精確度變高一些。可是這種方式會使離觀察者較近的物體被裁減掉,所以須要調試好裁剪面參數
  • 離觀察者較近的物體被裁減掉,所以須要調試好裁剪面參數。 使用更高位數的深度緩衝區,一般使用的深度緩衝區是24位的,如今有一些硬件使用32位的緩衝區,使精確度獲得提⾼
相關文章
相關標籤/搜索