零基礎學習OpenGL(三) 深度測試

2021-09-02 01:11:59 字數 1603 閱讀 1495

深度緩衝:在每個片段中儲存了資訊,以16、24、32位float的形式儲存它的深度值。(片段著色器執行之後,在螢幕空間中執行。)

當深度測試啟用,opengl會將乙個片段的深度值和深度緩衝的內容相比,如果測試通過,深度緩衝將更新為新的深度值;如果測試失敗,片段丟棄。

啟用深度測試:

glenable(gl_depth_test);

在每個渲染迭代之前清除深度緩衝:

glclear(gl_color_buffer_bit | gl_depth_buffer_bit);

在某些情況下,如果我們只需要對所有片段深度測試並丟棄測試失敗的片段,而不希望更新深度快取的話,使用下面改為唯讀:

gldepthmask(gl_false);

深度測試函式:(我們來控制什麼時候通過或丟棄乙個片段,什麼時候更新深度緩衝)

gldepthfunc(gl_less);

gl_less可以是下面的這些函式:

gl_always

永遠通過深度測試

gl_never

永遠不通過深度測試

gl_less

在片段深度值小於緩衝的深度值時通過測試

gl_equal

在片段深度值等於緩衝區的深度值時通過測試

gl_lequal

在片段深度值小於等於緩衝區的深度值時通過測試

gl_greater

在片段深度值大於緩衝區的深度值時通過測試

gl_notequal

在片段深度值不等於緩衝區的深度值時通過測試

gl_gequal

在片段深度值大於等於緩衝區的深度值時通過測試

舉個栗子:

glenable(gl_depth_test);

gldepthfunc(gl_always);

總是通過深度測試,那也就表示沒有深度測試,結果是最後繪製的就在之前繪製的上面。

而如果使用gldepthfunc(gl_less),結果為:

深度緩衝的值是0.0--1.0之間,但是觀察空間下z值為近平面到遠平面之間任意的值,需要將z值變換在0.0--1.0之間。公式如下:

在實踐中是幾乎永遠不會使用這樣的線性深度緩衝。要想有正確的投影性質,需要使用乙個非線性的深度方程,它是與 1/z 成正比的。它做的就是在z值很小的時候提供非常高的精度,而在z值很遠的時候提供更少的精度。

深度衝突:深度值一樣的地方,深度緩衝沒有足夠的精度來決定兩個形狀哪個在前面。結果就是這兩個形狀不斷地在切換前後順序,這會導致很奇怪的花紋。

所以,不要把物體擺的太靠近,防止三角形重疊;近平面設定的遠一些,因為精度在靠近近平面的時候非常高,但是太遠會導致近處的被裁剪。

參考自

零基礎深度學習

本內容比較適合零基礎但對人工智慧技術與人工智慧程式開發感興趣,想從事人工智慧相關工作或需要在本職工作中加入人工智慧技術的在職人員或在校學生。以python為主要開發語言,深入淺出快速上手最先進的深度學習技術。收穫 能夠使用程式開發技能完成諸如計算機視覺 自然語言處理等人工智慧任務,例如影象識別 智慧...

零基礎學習OpenGL(五) 混合

opengl中,混合用來實現物體透明度。透明就是說乙個物體的顏色是物體本身的顏色和它背後其它物體的顏色的不同強度結合。乙個物體的透明度是通過它顏色的aplha值來決定的。想載入有alpha值的紋理時,要在紋理生成過程中告訴opengl,我們的紋理現在使用alpha通道了 glteximage2d g...

零基礎學習OpenGL(十一) Gamma校正

人眼對光的敏感度在不同亮度上是不一樣的,人眼會對暗的區域變化更加敏感。如果用8位空間來儲存畫素,0 1區間可以表示256種亮度,但是我們不會一半表示暗的,一半表示亮的 即暗和亮都是128種顏色 因為我們應該花更多的空間去儲存暗的區域,換句話說,暗的需要被區分成更多種。編碼 當攝影裝置儲存 時對畫素進...