OpenGL:任何顶点 Z 坐标是否必须为负数?

OpenGL: Must any vertex Z coordinate be negative or not?

我了解到 OpenGL 中的相机被定义为朝负 Z 方向看。所以在一个简单的例子中,我想象要渲染我的顶点,它们必须类似于以下定义:

rawverts = {
    0.0f, 0.0f, -1.0f,
    0.0f, 0.5f, -1.0f,
    0.5f, 0.0f, -1.0f,
};

但是,绝对没有向导会告诉我答案。在我所看到的任何地方,"Hello triangle" 示例都是在 z 坐标为 0 的情况下制作的,每当定义更复杂的网格时,坐标甚至都不会显示。我仍然不知道要将它们绘制到屏幕上的坐标的可能值。举个例子,glm::perspective:

glm::mat4 projectionMatrix = glm::perspective(
    FoV,         // The horizontal Field of View, in degrees : the amount of "zoom". Think "camera lens". Usually between 90° (extra wide) and 30° (quite zoomed in)
    4.0f / 3.0f, // Aspect Ratio. Depends on the size of your window. Notice that 4/3 == 800/600 == 1280/960, sounds familiar ?
    0.1f,        // Near clipping plane. Keep as big as possible, or you'll get precision issues.
    100.0f       // Far clipping plane. Keep as little as possible.
);

但是如何用任何值定义裁剪平面?相机朝向-Z方向!此外,如果我在 -1 和 -4 处创建 near/far 裁剪平面,这是否会使任何大于 -1 或小于 -4 的 Z 坐标无效?还是原始 z 坐标仅在 0 和 -1 之间有效(同样,z 坐标肯定不能为正数?)..?

但让我们假设实际发生的情况是 OpenGL(或 glm)采用裁剪平面值并秘密地否定它们。所以,我的 -1 到 -4 变成了 1 到 4。这是否会使任何小于 1 和大于 4 的 Z 坐标无效,这就是 0.0f, 0.0f, -1.0f 不会在屏幕上绘制的原因?

在这个阶段,我会将答案视为指向一本书或一些 material 有关于此事的信息的指针。

不,points/vertices 可以有一个正的 z 坐标,但除非将相机移回,否则您将看不到它们。

This article 谈到了大约三分之一的过程。

你的问题是你不了解坐标系和变换。

首先是 window 坐标。它是您 window 中的像素网格,非常简单。没有z轴。

接下来是国家数据中心。 Google吧。它是一个在 xyz 轴上从 -1 到 1 的立方体。如果您同时加载具有标识的模型视图和投影矩阵,这就是您在其中渲染的 space。通过指定视口,您可以将 NDC 坐标转换为 window 坐标。来自立方体外部顶点的像素被剪裁。

你对投影和模型视图矩阵所做的是在 NDC 立方体上创建一个转换,使其覆盖你的对象。移动相机时,您会改变变换。转换可以将顶点从任何位置转换到 NDC 立方体,包括负 z 坐标。

这是事情运作方式的简短版本。长版的太长了这里就不输入了。如需更多信息,请提出具体问题或阅读有关该主题的一些文献。