對 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,則很難可視化,需要作額外的計算,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/231813.html
標籤:其他
