3

为了提高我对 OpenGL 和 3D 的理解,我正在尝试实现一个仅在 CPU 上运行的简单渲染管道。在有意义的地方,我正在尝试使用与 OpenGL 相同的标准。例如,我正在使用像 OpenGL 这样的右手坐标系。正如在学习新事物时经常发生的那样,我现在遇到了一个我找不到答案的问题。如果以下内容有不妥之处,请见谅并指正。

在剪辑空间(您gl_Position在顶点着色器中指定的坐标)中,负 Z 远离用户。但在深度缓冲区中,正 Z 不存在(如果您使用默认深度设置)。

这个问题的一个答案表明翻转是由于投影变换。但我做了一个小实验(基于 WebGL/OpenGL ES),结果恰恰相反:在剪辑空间中,Z 指向远离用户,即使您不使用投影变换。

所以在某些时候,在你将gl_PositionOpenGL 交给它之后,它会翻转 Z 坐标。那是什么时候,怎么样?

我的猜测是它在视口转换中,但我无法找到支持这一点的文档。

4

2 回答 2

3

OpenGL 中的 Clip-Space 已经是左撇子(而且一直都是)。因此,在现代 GL 中,没有明确使用右手系统的空间,并且根本没有进行“翻转”。然而,旧 GL 中的眼睛空间通常是用右手定义的,并且“翻转”是作为投影矩阵的一部分完成的,glFrustum()并且gluPerpective()明确期望近处和远处的正值指代相应的负 z 值。然而,由于你可以使用任意矩阵,你永远不会被迫用右手定义你的眼睛或物体空间,这就像一个默认约定。仍然有很多人使用可编程管道遵循这个约定。

于 2013-07-15T14:52:24.637 回答
0

根据WebGL Beginner's Guide,在投影变换后完成的透视分割过程中,z 轴是倒置的。

这是它所说的:

透视分割将视锥体转换为以原点为中心的立方体,最小坐标为 [-1,-1,-1],最大坐标为 [1,1,1]。另外,z轴的方向是倒置的,如下图所示:

在此处输入图像描述

于 2017-03-22T12:41:50.233 回答