2015-10-26 19 views
0

Ive編碼的着色器噸,但我偶然發現了一些我從未意識到的東西。近/遠平面和z正字柵格化

我需要一個頂點+片段着色器以簡單的正投影,沒有深度測試。

相機與原點對齊。

我禁用GL_DEPTH_TEST,蒙面深度寫道。事實如此簡單,我決定我甚至不需要投影矩陣。在我完全的無知和獨創性中,我認爲對於任何三角形頂點,頂點着色器只會將x,y(,z = <whatever>,w = 1)傳遞給片段着色器。

我實際上認爲片段着色器只需要x,y座標,因爲我們談論的是正射投影,w = 1(無透視除法),並且由於深度緩衝沒有用,並且禁用了深度寫入,所以z可以字面上什麼,沒關係。

當然我錯了。我很快發現z組件很受光柵化器的使用,事實上,我有大量的三角形,它們不會被光柵化。

我還發現,調整z分量將極大地改變渲染的三角形。所以我實現了一個正規的正投影矩陣,這當然解決了這個問題,現在一切都被正確地光柵化了。

現在,出於純粹的好奇心,我開始用正投影矩陣玩,看看究竟產生不同的輸入向量,用不同的值近及遠剪切面,我實在無法理解。好的,x,y和w都如預期的那樣,但是基於我的近/遠剪切平面,我得到了完全不同的z值。

問題是:片段着色器不知道剪切平面和投影矩陣的任何內容,它只是得到一堆x,y,z,w ... z組件在光柵化過程中的角色是什麼?它是如何知道是否有什麼東西在觀看內部?

我的意思是,對於任何給定的近/遠平面的正交投影矩陣,我得到的有效期爲一個給定的投影矩陣,併爲他人非法z值。由於片段着色器無法知道矩陣中使用了哪些平面,它如何丟棄碎片?同一個圖元的每個頂點之間是否存在關係?

PS:我知道這個片段着色器甚至不調用,因爲我設置一個SSBO +原子計數器,並檢查都是不變的。

+3

柵格化在片段着色器階段之前執行 - 它實際上是生成片段的東西。 Znear/Zfar將剪輯空間中的最小/最大值調整爲匹配z = 1和z = -1。只需剪下不適合單位立方體的剪輯(在剪輯空間 - 投影和透視分割後),一切都很好。 – keltar

+0

你的結果矩陣是什麼?爲什麼你的ZFAR比ZNEAR更大?在opengl中,Z軸從深度到相機。在紙上快速計算給出z = 300時給定的〜0.7317,給出znear/zfar(當然是倒置的)。 – keltar

+0

你是對的..我刪除了我的previuos _incorrect_示例,我重新計算了一切,並且我有一個符號錯誤..你是正確的..它只是從-1到+1的縮放,如果在frustrum內......如果你發佈我會接受它的答案。謝謝。 – user815129

回答

2

頂點着色器將頂點從模型局部座標系轉換到剪輯空間。如果在透視分割(每個尺寸爲[-1; 1]尺寸的立方體,或者在分割前爲[-W; W])後,您的座標超過單位立方體,則剪切該片段。

如果您不關心Z並且真的不想設置正確的正投影(例如,您不知道Z值範圍,因此無法設置合適的剪貼平面),那麼可以通過以下方法來校正Z:頂點着色器中的Z將其固定到(-W; W)範圍(或者將其設置爲0)。