透视投影矩阵的最后一行
Last Row of the perspective projection matrix
你能给我解释一下 gl_projection 矩阵最后一行 -1 的 目的 是什么吗?以及它如何影响透视分割步骤?
如此处所述:http://www.songho.ca/opengl/gl_projectionmatrix.html
"Therefore, we can set the w-component of the clip coordinates as -ze. And, the 4th of GL_PROJECTION matrix becomes (0, 0, -1, 0)."
透视投影的本质 属性 是将 x/y 坐标除以深度(与观察者的距离)。这使得靠近观察者的对象(具有较小的深度值)更大,而远离观察者的对象(具有较大的深度值)较小。
下一个难题是齐次坐标的工作原理。顶点着色器生成的齐次 space 中的 (x, y, z, w) 坐标通过除以 w:
转换为常规 3D 坐标
(x, y, z, w) --> (x/w, y/w, z/w, 1)
所以我们要除以深度来实现透视,我们知道顶点着色器产生的坐标会除以w。为了得到想要的结果,我们可以简单地将眼睛坐标 space 中的深度值放入 w 坐标中。
这正是投影矩阵最后一行所做的。最后一行与输入向量(即顶点的眼睛 space 坐标)的点积产生输出的 w 值:
(0 0 -1 0) * (x y z 1) = -z
你可能期望矩阵元素的值为1,简单地将eye space中的z值复制到顶点着色器输出的w值。我们使用 -1 反转符号的原因是基于 OpenGL 中眼睛 space 坐标的常见排列方式。
OpenGL 中的眼睛坐标通常以 "camera" 为原点,向下看 负 z 轴。所以 z 坐标的可见范围具有负值。由于我们想要在生成的 w 坐标中与观察者的距离,我们翻转眼睛的符号 space z 坐标,这将负 z 值转换为距原点的正距离值。
请注意,其中大部分只是通用策略,部分植根于遗留的固定功能管道。借助当前 OpenGL 版本中使用的可编程管线,您可以完全自由地组织坐标 space 和变换。例如,您可以轻松地使用眼睛 space 坐标系,其中相机指向正 z 方向,然后在投影矩阵的最后一行使用 1 而不是 -1。
你能给我解释一下 gl_projection 矩阵最后一行 -1 的 目的 是什么吗?以及它如何影响透视分割步骤?
如此处所述:http://www.songho.ca/opengl/gl_projectionmatrix.html
"Therefore, we can set the w-component of the clip coordinates as -ze. And, the 4th of GL_PROJECTION matrix becomes (0, 0, -1, 0)."
透视投影的本质 属性 是将 x/y 坐标除以深度(与观察者的距离)。这使得靠近观察者的对象(具有较小的深度值)更大,而远离观察者的对象(具有较大的深度值)较小。
下一个难题是齐次坐标的工作原理。顶点着色器生成的齐次 space 中的 (x, y, z, w) 坐标通过除以 w:
转换为常规 3D 坐标(x, y, z, w) --> (x/w, y/w, z/w, 1)
所以我们要除以深度来实现透视,我们知道顶点着色器产生的坐标会除以w。为了得到想要的结果,我们可以简单地将眼睛坐标 space 中的深度值放入 w 坐标中。
这正是投影矩阵最后一行所做的。最后一行与输入向量(即顶点的眼睛 space 坐标)的点积产生输出的 w 值:
(0 0 -1 0) * (x y z 1) = -z
你可能期望矩阵元素的值为1,简单地将eye space中的z值复制到顶点着色器输出的w值。我们使用 -1 反转符号的原因是基于 OpenGL 中眼睛 space 坐标的常见排列方式。
OpenGL 中的眼睛坐标通常以 "camera" 为原点,向下看 负 z 轴。所以 z 坐标的可见范围具有负值。由于我们想要在生成的 w 坐标中与观察者的距离,我们翻转眼睛的符号 space z 坐标,这将负 z 值转换为距原点的正距离值。
请注意,其中大部分只是通用策略,部分植根于遗留的固定功能管道。借助当前 OpenGL 版本中使用的可编程管线,您可以完全自由地组织坐标 space 和变换。例如,您可以轻松地使用眼睛 space 坐标系,其中相机指向正 z 方向,然后在投影矩阵的最后一行使用 1 而不是 -1。