對 OpenGL 中 depth 概念的理解

2022-03-16 12:22:57 字數 1011 閱讀 1835

首先,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,則很難視覺化,需要作額外的計算。

OpenGL基礎概念(一)

頂點 vertexs 圖元 primitives 片元 fragments片斷 畫素 pixels 階段1.頂點 圖元 幾何頂點被組合為圖元 點,線段或多邊形 然後圖元被合成片元,最後片元被轉換為幀快取中的象素數據。階段2.圖元 片元 圖元被分幾步轉換為片元 圖元被適當的裁剪,顏色和紋理資料也相應作...

opengl中對glOrtho 函式的理解

glortho是建立乙個正交平行的視景體。一般用於物體不會因為離螢幕的遠近而產生大小的變換的情況。比如,常用的工程中的製圖等。需要比較精確的顯示。而作為它的對立情況,glfrustum則產生乙個透視投影。這是一種模擬真是生活中,人們視野觀測物體的真實情況。例如 觀察兩條平行的火車到,在過了很遠之後,...

NGUI中深度depth和z軸關係

gui中是用depth來控制sprite顯示順序的,本來這很好用,但碰到上面帖子中的問題時卻不好解決了,於是我試驗了下。以下是一些總結,不對的地方請指正。下面的內容可能看起來比較繞,這樣的話只需實際試驗下就能很容易的知道結果,呵呵 如果還是看不明白,可以先看,那裡有個總結 1,同乙個panel下,同...