2012-10-21 83 views
1

我剛開始使用片段着色器,並且在完成一些簡單的等離子效果後,我卡住了。我已經知道,你可以檢索片段的X,Y和Z,我想建立一個着色器,將根據他們的Z.瞭解片段

這裏顏色片段是我到目前爲止有:

void main() { 
    float z = gl_FragCoord.z; 
    float t = (sin(z) + 1) * 0.5; 

    gl_FragColor = vec4(t, t, t, 1); 
} 

的問題是我正在用三角形測試它,不管我如何旋轉它,它具有相同的常量顏色,所以我開始問自己(並在SO上):爲什麼是單一顏色的三角形?這不是Z應該是每個片段?

回答

2

gl_FragCoord中的z座標在0和1之間歸一化(其中0對應於近平面,1對應於遠平面)。使用透視投影,這種映射對於近平面是非線性的。這意味着即使旋轉時,您的三角形也可能會映射到相同的顏色。

這是值得指出的是,你的總體思路工作得很好(在我的GLSL着色器編輯器創建): http://goo.gl/32Voo

注意,我在這裏使用orthogonale投影以獲得更好的深度可視化 - 切換到投影使得顏色幾乎相同(只有幾個百分比)。

+0

請注意,您還可以通過應用投影矩陣的逆來很容易地從透視投影深度值重建攝像機空間Z值(這可以反過來完成必須比全矩陣乘法更便宜,因爲所有的透視投影矩陣中的零項)。這樣,你的三角形仍然是透視正確的,但你可以基於線性Z值進行着色。 – MikeMx7f