Opengl着色器管道深度计算



我试图找出在一个顶点片段着色器对内部发生了什么。更具体地说,我试图比较cpu上的深度值。这些深度值中的一个由着色器计算并对应于gl_FragCoord。z值。我所知道的是,深度输出在[0,1]的范围内,并且不是线性的。那么,有没有人知道在给顶点着色器提供深度和在片段着色器中读取深度之间会发生什么?opengl如何将深度转换为范围[0,1]?

提前感谢!

经过矩阵变换后,顶点[v]在规范视图体中,如果满足:

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

透视图分割后的(w):

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

深度值的归一化范围[0,1]则由:

depth = 0.5 * (z' + 1.0)

在一个简单的OpenGL渲染器中,深度值将由顶点着色器中的矩阵转换生成。在我的情况下,我的基本顶点着色器做以下操作:

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

作为输入的三个矩阵由我的应用程序控制;我可以完全控制它们,如果我愿意的话,可以手动完成这个过程。

总结:找出你要发送给顶点着色器的矩阵并进行数学计算。转换发生在顶点着色器本身,最重要的矩阵在你的情况下可能是ProjectionMatrix,它负责映射到[0,1],因为它有(至少它应该有)视图的知识。