我试图弄清楚顶点片段着色器对内部发生了什么。更具体地说,我试图比较cpu上的深度值。这些深度值中的一个由着色器计算,并对应于gl_FragCoord.z值。 我所知道的是深度输出在[0,1]范围内而不是线性的。那么有谁知道在将深度馈送到顶点着色器并在片段着色器中读出它之间的任何给定深度值会发生什么? opengl如何将深度转换为范围[0,1]?
提前多多感谢!
答案 0 :(得分: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 :(得分:1)
应用矩阵变换后,如果顶点[v]
满足,则顶点- v.w <= v.x <= v.w, - v.w <= v.y <= v.w, - v.w <= v.z <= v.w
位于规范视图卷中:
-1 <= x' <= 1, -1 <= y' <= 1, -1 <= z' <= 1 (where: x' = v.x / v.w, etc.)
在(w)透视划分之后:
depth = 0.5 * (z' + 1.0)
深度值的归一化范围[0,1]由下式给出:
{{1}}