我知道zNear,zFar标记了场景的剪切边界。但 OpenTK 将值限制为大于零。这是否意味着我的所有对象都应该在正 Z 轴上绘制,以免被剪裁?
不,这只是查看翻译后的渲染剪辑。因此,如果您渲染一个基于例如{0,0,-100}
的对象,相机在{0,0,-110}
,如果在裁剪平面内,它仍然会渲染,但更远的东西-110+zFar
和-110-zNear
将被裁剪。这是一个非常简单的解释,但实际上是它是如何工作的。
不要混淆坐标可以表示或转换为的不同空间。 复选标记的答案过于简单,以至于在许多情况下甚至可能不是正确答案。
zNear 和 zFar 是与"相机"或视图之眼的距离,以世界单位表示,但不是世界坐标。因此,它们必须是正数。它们也处于负面的眼睛或相机空间中。 仅当相机与指向 -z 空间的 z 轴对齐时,复选标记的答案才正确,或者您关于被剪辑内容的陈述是正确的。
它们确实有助于定义最近和最远的剪裁边界,但它们不会标记场景的剪裁边界。 同样,这取决于相机的位置。 以及您对"场景"的定义。
人们常说OpenGL没有摄像头。但我宁愿不这样想。有风景,因此有摄像头。 使用lookAt
功能,您可以将视图/相机放置在场景中的任何位置,并将其指向您想要的任何方向。对我来说,你的场景就是你正在渲染的所有对象,而不仅仅是这些对象的当前视图。这样想来,你的zNear和zFar根本不会限制你的场景,它们只会限制相机的观看深度。 它更像是从你的眼睛里伸出的卷尺。随着你对事物的看法的变化,它是矢量的变化。
例如,想象一个场景,即沿 x 和 z 轴的行和列中的块网格,但所有块的 y 均为 0。 如果您的相机与 z 轴对齐,则 zNear 和 zFar 与世界 z 轴相关。 您可能会看到一排排块远离相机。 但是,如果相机以一+100
的速度漂浮在一切事物之上并指向下方,那么您会看到它更像是一个网格。在这种情况下,zNear 和 zFar 与场景中的 z 轴无关。 它们只与摄像机在摄像机 z 轴上的对象上的剪辑有关 - 在摄像机空间中。