1. 程式人生 > 實用技巧 >對 OpenGL 中 depth 概念的理解

對 OpenGL 中 depth 概念的理解

對 OpenGL 中 depth 概念的一些理解

首先,OpenGL Pipeline 有這些 transform:

Model View Projection -> Clipping -> [ Perspective Divide( a part of Projection) ] -> Viewport transform

在 Clipping 階段中,不在使用者定義的 view volume 中的點會被去掉,這個 view volume 的引數即 Projection Matrix 的引數,Perspective/Orthographic Projection 中設定的 left right bottom top near far.

Perspective Divide 實際上是 Projection 計算的一部分,只是這一部分已經 fix 在 pipeline 當中。在這一步變換之後,所有的座標點都已經變換到 NDC 空間當中了。

Viewport transform: 將 NDC 空間的點變換到定義的 window space 中。 實際上當我們呼叫glViewport() 函式,我們只是定義了 viewport 的 2d 的範圍大小。我們沒有顯式的提供 depth 的大小範圍。但是我們知道,當 enable depth test 後,depth buffer 會有當前繪製的 depth 資訊,而且我們也可以在 fragment shader 的 gl_FragCoord.z

/ gl_FragDepth 中獲取到深度的具體數值。那麼深度數值的範圍是多少呢? glDepthRange() 提供了定義深度值的介面。如果不呼叫的話,預設的數值是:near 0, far 1. 在陰影的相關學習過程中會有將深度值直接繪製的嘗試,那麼在預設情況下,確實可以直接繪製,因為其範圍正好和 shader 中的顏色的範圍一致。但是這裡需要注意的是,如果在 Projection 矩陣中設定了很大的前後區域,比如 near 1.0, far 1000.0 那麼在上面的一系列變換之後,基本上所有的深度值都在 near 附近,也即將近0,則很難視覺化,需要作額外的計算。