OpenGL:任何顶点Z坐标都必须是负数吗?

时间:2016-03-28 13:33:18

标签: opengl glm-math

据我所知,OpenGL中的相机被定义为在负Z方向上查看。所以在一个简单的例子中,我想我的顶点要渲染,它们的定义必须类似于以下内容:

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

然而,绝对没有指南会告诉我答案。在我看的每个地方," Hello三角形"示例是在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处创建近/远剪裁平面,这是否会使任何大于-1或小于-4的Z坐标无效?或者原始z坐标是否仅在0和-1之间有效(同样,z坐标肯定不能为正?)?

但是让我们假设实际发生的事情是OpenGL(或glm)获取剪切平面值并暗中否定它们。所以,我的-1到-4变为1到4.这是否会使任何小于1且大于4的Z坐标无效,这就是为什么0.0f, 0.0f, -1.0f不会在屏幕上绘制的原因?

在这个阶段,我会把答案简单地当作指向一本书或某些材料的指针来处理这个问题。

2 个答案:

答案 0 :(得分:3)

不,点/顶点可以有正z坐标,但除非相机被移回,否则你不会看到它们。

This article谈论了大约三分之一的时间。

答案 1 :(得分:0)

您的问题是您不了解坐标系和转换。

首先是窗口坐标。它是你窗口中的像素网格,纯粹简单。没有z轴。

接下来是NDC。谷歌一下。它是xyz轴上从-1到1的立方体。如果同时加载带有标识的模型视图和投影矩阵,则这是您渲染的空间。通过指定视口,您可以从NDC转换为窗口坐标。来自立方体外顶点的像素被剪裁。

您对投影和模型视图矩阵的处理方法是在NDC多维数据集上创建转换,使其覆盖对象。移动相机时,可以改变变换。变换可以将顶点从任何位置转换为NDC立方体,包括负z-坐标。

这是事情如何运作的简短版本。漫长的版本太长了,无法进入这里。有关更多信息,请询问具体问题或更好地阅读有关该主题的文章。