2011-11-08 60 views
2

我試圖找出一個頂點,片段着色器對內部發生。爲了更具體,我試圖比較CPU上的深度值。這些深度值由着色器計算並對應於gl_FragCoord.z值。 我所知道的是深度輸出在[0,1]範圍內,而不是線性。那麼是否有人知道在將深度提供給頂點着色器並在片段着色器中讀出它之間給定的深度值會發生什麼? opengl如何將深度轉換爲範圍[0,1]?OpenGL着色管道深度計算

非常感謝!

回答

1

在一個簡單的OpenGL渲染的深度值將由在頂點着色器的矩陣變換來生成。在我的情況下,我的基本頂點着色器執行以下操作:

mat4 mvpMatrix = ProjectionMatrix * ViewMatrix * ModelMatrix; 
vec4 pos = vec4(ObjectPosition.x, ObjectPosition.y, ObjectPosition.z, 1.0); 

gl_Position = mvpMatrix * pos; 

作爲輸入的三個矩陣由我的應用程序控制;如果我願意,我可以完全控制它們,並可以手動完成該過程。

總結:找出哪些矩陣要發送到頂點着色器和做數學題。轉換髮生在頂點着色器本身中,而最重要的矩陣可能是ProjectionMatrix,它負責映射到[0,1],因爲它至少具有視口的知識。

1

應用矩陣轉換後,一個頂點[v]是經典視圖體積,如果它滿足:

-1 <= x' <= 1, -1 <= y' <= 1, -1 <= z' <= 1 (where: x' = v.x/v.w, etc.) 

歸一化的範圍爲[0:

- v.w <= v.x <= v.w, - v.w <= v.y <= v.w, - v.w <= v.z <= v.w 

由(w)的透視分割後

depth = 0.5 * (z' + 1.0) 
:,1]的深度值由下式給出