我试图弄清楚在顶点片段着色器对内部发生了什么。更具体地说,我正在尝试比较 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],因为它具有(至少应该具有)视口的知识。