天天看點

opengl深度測試



   openGL裡常出現深度測試,一直不清楚。今天就來弄清楚。

  (1)什麼是深度?

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

   深度值(Z值)越大,則離錄影機越遠。

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

  (2)為什麼需要深度?

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

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

 (2)啟用深度測試

     使用 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)将深度緩沖區設定為隻讀形式,否則可能出現畫面錯誤。為什麼呢,因為畫透明物體時,将使用混色,這時就不能繼續使用深度模式,而是利用混色函數來進行混合。這一來,就可以使用混合函數繪制半透明物體了。

繼續閱讀