OpenGL中的zNear和zFar是什么意思?

4
我理解 zNear 和 zFar 标记场景的裁剪边界。但 OpenTK 限制这些值必须大于零。这是否意味着所有我的对象都应该绘制在正 Z 轴上,以避免被裁剪?
2个回答

4
不,这只是渲染裁剪,在查看翻译后。因此,如果您将一个基于例如{0,0,-100}的对象渲染到相机位置为{0,0,-110},则仍然会在裁剪平面内进行渲染,但是比-110+zFar-110-zNear更远的东西将被裁剪。这是一个相当简单的解释,但实际上它是如何工作的。

你是不是想说 -110+zNear - Reto Koradi

3
不要混淆坐标可以表示或转换的不同空间。勾选的答案过于简化,以至于在许多情况下可能甚至不是正确答案。zNear和zFar是距离“相机”或视图中的眼睛的世界单位距离,但不是世界坐标。因此,它们必须是正数。它们也有点在负的眼睛或相机空间中。只有当相机与指向-z空间的z轴对齐时,勾选的答案才是正确的,或者你关于正在被裁剪的内容的陈述是正确的。它们确实有助于定义最近和最远的裁剪边界,但它们不标记场景的裁剪边界。这又取决于您相机的位置。还有您对“场景”的定义。通常说OpenGL没有相机。但我不喜欢那样想。有一个视图,因此有一个相机。使用lookAt函数,您可以将视图/相机放置在场景中的任何位置,并朝向任何方向。对我而言,您的“场景”是您正在渲染的所有对象,而不仅仅是这些对象的当前视图。以这种方式思考,您的zNear和zFar根本不限制您的场景,它们只限制相机的视野深度。它更像是从您的眼睛伸出的卷尺。随着您对事物的视图变化,它的向量也会发生变化。例如,想象一个由沿x和z轴排列的块网格组成的场景,但所有块都在y = 0处。如果您的相机与z轴对齐,则zNear和zFar与世界z轴相关。你可能会看到一排排远离相机的块。但是,如果相机漂浮在所有物体上方,y为+100,并朝下指,那么您会将其视为一个网格。在这种情况下,zNear和zFar与场景中的z轴无关。它们只与相机空间中相机的z轴上物体的裁剪有关。

你的回答有一些是正确的,但我不能同意全部。“因此它们必须是正数”。这不是真的。你可以在-10,-10,-10处渲染一个对象。正如你所指出的,这完全取决于你的相机在哪里。问题陈述为“这是否意味着所有我的对象都应该在正Z轴上绘制”,所以我认为你的陈述可能会对OpenGL新手有点困惑。希望这不会听起来太苛刻,因为我相信这扩展了我的答案,但我只是希望确保没有人会对手头的问题感到困惑。我更喜欢“保持简单”的方法 :) - Gavin Simpson
不,近距离和远距离的值始终为正,因为它们是相对于“相机”的前方和远离的距离。你不能有这样的负距离。也许你是对的,我需要更好地解释一下,但肯定你也需要理解。如果我有更多时间,我会添加一个图形,这将使它更清晰明了。 - badweasel
我声明一下,我没有给你的回答点踩。我之所以添加了一个回答是因为我看到了那个点踩。 - badweasel
zNear和zFar始终为正。我应该说“绘制一个对象”,而不是“渲染一个对象”。是的,我知道不是你投了反对票,别担心,我不怕反对票。但我认为你对“在正轴上绘制”的问题读得太多了。您的对象不需要正坐标才能在屏幕上绘制和渲染。我也认为需要多个图表才能解释100%,但是https://dev59.com/PWQn5IYBdhLWcg3wxZri会有所帮助。 - Gavin Simpson
1
我认为我们两个都没有用另一个人喜欢的方式来解释它。我不能争论这个问题的语义学。我的唯一目标是帮助那些有这个问题的人。也许有些人会从你的解释中理解,而另一些人则从我的解释中理解。 - badweasel
我偶然发现了这个链接(http://webglfundamentals.org/webgl/lessons/webgl-3d-perspective.html),其中有一张图解释了znear和zfar,这是我们两个人都想要的东西,我马上想在这里分享一下。 - Gavin Simpson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接