【问题标题】:OpenGL what does zNear zFar mean?OpenGL zNear zFar 是什么意思?
【发布时间】:2015-02-04 07:10:33
【问题描述】:

我了解 zNear、zFar 标记了场景的剪裁边界。但是OpenTK restricts 的值要大于零。这是否意味着我所有的对象都应该在 Z 轴正方向上绘制,这样它就不会被剪裁?

【问题讨论】:

    标签: opengl opentk opengl-4


    【解决方案1】:

    不要混淆坐标可以在其中表示或转换为的不同空间。带有复选标记的答案过于简单化,以至于在许多情况下它甚至可能不是正确答案。

    zNear 和 zFar 以世界单位表示距“相机”或视线的距离,但不是以世界坐标表示。因此它们必须是正数。它们也是某种在负眼睛相机空间。仅当相机与指向 -z 空间的 z 轴对齐时,复选标记的答案才是正确的,或者您对剪辑内容的陈述是正确的。

    它们确实有助于定义最近和最远的剪辑边界,但它们不会标记场景的剪辑边界。同样,这将取决于您的相机的位置。还有你对“场景”的定义。

    人们常说 OpenGL 没有摄像头。但我不想那样想。有一个视图,因此有一个相机。使用lookAt 函数,您可以将视图/相机放置在场景中的任何位置,并将其指向您想要的任何方向。对我来说,您的 场景 是您正在渲染的所有对象,而不仅仅是这些对象的当前视图。这样想你的 zNear 和 zFar 根本不会限制你的场景,它们只会限制你相机的观察深度。它更像是从你的眼睛伸出的卷尺。它的矢量会随着你对事物的看法发生变化而变化。

    例如,想象一个场景中的块网格沿 x 和 z 轴呈行和列排列,但所有的 y 都为 0。如果您的相机与 z 轴对齐,则 zNear 和 zFar 与世界 z 轴相关.您可能会看到成排的方块远离相机。但是,如果相机在+100 的 y 处漂浮在所有物体上方并指向下方,您会看到它更像是一个网格。在这种情况下,zNear 和 zFar 与场景中的 z 轴无关。它们只与相机在相机 z 轴(相机空间)中对象的剪裁有关。

    【讨论】:

    • 您在这里的某些回答是正确的,但我不能完全同意。 “因此它们必须是正数”。不对。您可以在 -10、-10、-10 处渲染对象。正如您所指出的,这完全取决于您的相机在哪里。问题指出“这是否意味着我的所有对象都应该绘制在正 Z 轴上”,所以我认为您的陈述对于 OpenGL 新手来说可能有点令人困惑。我希望这听起来不刺耳,因为我相信它会扩展我的回答,但我只是希望确保没有人对手头的问题感到困惑。我只是更喜欢“保持简单”。方法:)
    • 不,near 和 far 值始终为正,因为它们是“相机”前后的距离。你不能有这样的负距离。也许你是对的,我需要更好地解释它,但你肯定需要。如果我有更多的时间,我会添加一个图形,这样会更清楚。
    • 为了记录,我没有否决你的答案。我添加了一个答案,因为我看到了反对票。
    • zNear 和 zFar 总是肯定的。我应该说“绘制一个对象”,而不是“渲染一个对象”。是的,我知道投反对票的不是你,不用担心,我不担心投反对票。但是我认为您对“绘制正轴”的问题读得太多了。您的对象不需要在屏幕上绘制和渲染正坐标。我还认为需要不止一张图表来解释 100%,但stackoverflow.com/questions/16571981/… 会有所帮助。
    • 我认为我们俩都没有以其他人喜欢的方式解释它。我不能争论这个的语义。我唯一的目标是帮助有这个问题的人。也许有人会理解你的解释,而其他人会理解我的解释。
    【解决方案2】:

    不,这只是在查看翻译后的渲染剪辑。因此,如果您使用 {0,0,-110} 的相机渲染一个基于例如 {0,0,-100} 的对象,它仍然会在剪切平面内渲染,但更远的东西会被剪切 -110+zFar-110-zNear。这是一个非常简单的解释,但实际上它是如何工作的。

    【讨论】:

    • 你的意思是-110+zNear
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2017-06-11
    • 2018-03-05
    相关资源
    最近更新 更多