深度測試

細節點

  • 深度緩衝是在片段着色器運行之後(以及模板測試(Stencil Testing)運行之後)在屏幕空間中運行的
  • 屏幕空間座標與通過OpenGL的glViewport所定義的視口密切相關
  • 提前深度測試允許深度測試在片段着色器之前運行。只要我們清楚一個片段永遠不會是可見的(它在其他物體之後),我們就能提前丟棄這個片段
  • 當使用提前深度測試時,片段着色器的一個限制是你不能寫入片段的深度值。如果一個片段着色器對它的深度值進行了寫入,提前深度測試是不可能的。OpenGL不能提前知道深度值。【why】
  • OpenGL允許我們禁用深度緩衝的寫入,只需要設置它的深度掩碼(Depth Mask)設置爲GL_FALSE就可以了
  • 要記住深度緩衝中的值在屏幕空間中不是線性的(在透視矩陣應用之前在觀察空間中是線性的)
  • 一個很常見的視覺錯誤會在兩個平面或者三角形非常緊密地平行排列在一起時會發生,深度緩衝沒有足夠的精度來決定兩個形狀哪個在前面。結果就是這兩個形狀不斷地在切換前後順序,
  • 深度衝突是深度緩衝的一個常見問題,當物體在遠處時效果會更明顯(

防止深度衝突

  • 永遠不要把多個物體擺得太靠近,以至於它們的一些三角形會重疊
  • 儘可能將近平面設置遠一些。所以如果我們將近平面遠離觀察者,將近平面設置太遠將會導致近處的物體被裁剪掉,所以這通常需要實驗和微調來決定最適合你的場景的近平面距離。
  • 使用更高精度的深度緩衝。大部分深度緩衝的精度都是24位的,但現在大部分的顯卡都支持32位的深度緩衝
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章