opengl與OSG的深度測試


(1)什么是深度?

        深度其實就是該象素點在3d世界中距離攝象機的距離(繪制坐標),深度緩存中存儲着每個象素點(繪制在屏幕上的)的深度值!

   深度值(Z值)越大,則離攝像機越遠。

   深度值是存貯在深度緩存里面的,我們用深度緩存的位數來衡量深度緩存的精度。深度緩存位數越高,則精確度越高,目前的顯卡一般都可支持16位的Z Buffer,一些高級的顯卡已經可以支持32位的Z Buffer,但一般用24位Z Buffer就已經足夠了。

  (2)為什么需要深度?

   在不使用深度測試的時候,如果我們先繪制一個距離較近的物體,再繪制距離較遠的物體,則距離遠的物體因為后繪制,會把距離近的物體覆蓋掉,這樣的效果並不是我們所希望的。有了深度緩沖以后,繪制物體的順序就不那么重要了,都能按照遠近(Z值)正常顯示,這很關鍵。

        實際上,只要存在深度緩沖區,無論是否啟用深度測試,OpenGL在像素被繪制時都會嘗試將深度數據寫入到緩沖區內,除非調用了glDepthMask(GL_FALSE)來禁止寫入。這些深度數據除了用於常規的測試外,還可以有一些有趣的用途,比如繪制陰影等等。

 (2)啟用深度測試

         opengl(關閉深度測試):    glClearDepth  深度測試:開啟深度測試后,當視角變化時,模型的部分會消失;

         osg(關閉深度測試):        group->getOrCreateStateSet()->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);//關閉深度測試

     使用 glEnable(GL_DEPTH_TEST)啟用;

     在默認情況是將需要繪制的新像素的z值與深度緩沖區中對應位置的z值進行比較,如果比深度緩存中的值小,那么用新像素的顏色值更新幀緩存中對應像素的顏色值。

     但是可以使用glDepthFunc(func)來對這種默認測試方式進行修改。

     其中參數func的值可以為GL_NEVER(沒有處理)、GL_ALWAYS(處理所有)、GL_LESS(小於)、GL_LEQUAL(小於等於)、GL_EQUAL(等於)、GL_GEQUAL(大於等於)、GL_GREATER(大於)或GL_NOTEQUAL(不等於),其中默認值是GL_LESS。

    一般來將,使用glDepthFunc(GL_LEQUAL);來表達一般物體之間的遮擋關系。 

(3)啟用了深度測試,那么這就不適用於同時繪制不透明物體。

 

備注:

繪制半透明物體時,需注意:在繪制半透明物體時前,還需要利用glDepthMask(GL_FALSE)將深度緩沖區設置為只讀形式,否則可能出現畫面錯誤。為什么呢,因為畫透明物體時,將使用混色,這時就不能繼續使用深度模式,而是利用混色函數來進行混合。這一來,就可以使用混合函數繪制半透明物體了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM