在專案中遇到透明物體融合(blender)問題(如下圖),原因是處於後邊的透明如果在後繪製的情況下,會被深度測試無情的丟棄,因此重新梳理了一下深度測試和融合關係。用我自己的表述方式總結了此技術博文。
深度測試(depth testing)
深度測試是在片段著色器之後進行的,當深度測試開啟後,opengl會將片段儲存的深度值與深度快取depth buffer)儲存的值進行對比,根據規則進行深度測試,如果測試通過,那麼此片段的深度值將會儲存在深度緩衝中,代替原來的深度值。如果深度測試失敗了,該片段將會被丟棄。
融合(blending)
融合在深度測試之後進行,可以說針對的是透明物體,融合可以透過透明物體看到後邊的物體,具體演算法不在本文中具體分析。
多物體通過深度測試融合四種情況分析
背景:大方塊和小方塊處於座標(0,0,0)
繪製順序:透明大方塊物體 不透明小方塊
繪製順序: 不透明小方塊 透明大方塊物體
繪製順序:不透明大方塊物體 不透明小方塊
繪製順序: 不透明小方塊 不透明大方塊物體
上訴第一種和第三種情況,後方物體被後繪製,本來處於後方,在繪製的時候深度快取區中的已經儲存了靠前的深度值,深度測試不通過是肯定的,不通過該片斷就會被丟棄,後邊顏色快取區還是會顯示先繪製的物體。
第二種和第四種情況,大方塊被後繪製,z值較小深度測試一定通過,通過了以後就會和顏色快取區上個物體(小方塊)進行融合,得到該效果。
解決方案一:調整繪製的順序。
解決方案二(2019.8.13更新):
開啟深度測試,先將不透明物體繪製。
排序透明物體,鎖定深度測試的寫入功能,使其唯讀。(目的是在半透明畫素測試的時候,即使測試通過,也不會覆蓋原有畫素)
從後向前繪製所有半透明物體。
釋放深度快取區使其可讀可寫。
openGL 深度測試
opengl裡常出現深度測試,一直不清楚。今天就來弄清楚。1 什麼是深度?深度其實就是該象素點在3d世界中距離攝象機的距離 繪製座標 深度快取中儲存著每個象素點 繪製在螢幕上的 的深度值!深度值 z值 越大,則離攝像機越遠。深度值是存貯在深度快取裡面的,我們用深度快取的位數來衡量深度快取的精度。深度...
openGL 深度測試
opengl裡常出現深度測試,一直不清楚。今天就來弄清楚。1 什麼是深度?深度其實就是該象素點在3d世界中距離攝象機的距離 繪製座標 深度快取中儲存著每個象素點 繪製在螢幕上的 的深度值!深度值 z值 越大,則離攝像機越遠。深度值是存貯在深度快取裡面的,我們用深度快取的位數來衡量深度快取的精度。深度...
openGL 深度測試
opengl裡常出現深度測試,一直不清楚。今天就來弄清楚。1 什麼是深度?深度其實就是該象素點在3d世界中距離攝象機的距離 繪製座標 深度快取中儲存著每個象素點 繪製在螢幕上的 的深度值!深度值 z值 越大,則離攝像機越遠。深度值是存貯在深度快取裡面的,我們用深度快取的位數來衡量深度快取的精度。深度...