斜视截头体深度投影和裁剪 (Eric Lengyel)

Posted

技术标签:

【中文标题】斜视截头体深度投影和裁剪 (Eric Lengyel)【英文标题】:Oblique View Frustum Depth Projection and Clipping (Eric Lengyel) 【发布时间】:2021-07-17 13:47:05 【问题描述】:

试图理解倾斜剪裁方法我在理论方面遇到了一些问题。根据 Eric Lengyel 在第 2 章末尾写的 this 文章,我们得到了剪裁空间:

附近 远 ...

据说:

每个相机空间平面是 表示为投影矩阵两行的和或差

这一刻我无法理解。例如,如果说Near plane的值为“M4 + M3”(其中M4和M3分别是投影矩阵的第四行和第三行),其他值计算类似,那么结论就是投影矩阵必须是身份(从 M4 + M3 获得 结果)。但我们知道这是不同的。那么,谁能解释一下,我们使用什么矩阵,与投影矩阵有什么联系?

【问题讨论】:

【参考方案1】:

这一刻我无法理解。例如,如果说Near plane的值为“M4 + M3”(其中M4和M3分别是投影矩阵的第四行和第三行),其他值计算类似,那么结论就是投影矩阵必须是身份(从 M4 + M3 获得 结果)。

首先,您的逻辑在这里有很大缺陷。要从两个向量 a+b 的总和中得到向量 c=(0,0,1,1),您可以找到无限数量的向量 ab 来实现这一点,例如 (7,-2pi,0,42) + (-7, 2pi, 1, -41) = (0,0,1,1)

但是,这完全不是重点,因为您误解了该文章的关键部分。您在此处指定的剪切平面在剪切空间中(对于 w = 1 的特殊情况,如文章中所述)。如果我们想在裁剪空间中找到裁剪平面的方程,则完全不需要进行任何计算,因为裁剪平面是在裁剪中定义的空间作为固定方程。如果我们已经知道它会产生(0,0,1,1),那么计算M4+M3 是没有意义的。

整篇文章都在讨论如何有效地计算眼睛空间中的裁剪平面。那篇论文的表 1 非常清楚地说明了这一点:

【讨论】:

谢谢。看来,我误解了这些列之间的关系。在这种情况下,你能解释一下为什么相机空间中的近值将是 M4 + M3,我对此有点困惑。为什么意思就是这样。这样的结论是从哪里来的? 论文中指出,“给定任意投影矩阵 M,可以使用等式 (2) 的逆函数将这些平面映射到相机空间。这产生了表中列出的非常简单的公式1,其中每个相机空间平面表示为投影矩阵的两行的和或差[2]。“如果您需要更多详细信息,请阅读参考文章,但最后,这是非常简单的数学。 谢谢,@derhass!看来我是在笔和纸的帮助下搞定的。如果我们想得到 C(cam)=M(t)*C(clip) => Mt * = = M3 + M4

以上是关于斜视截头体深度投影和裁剪 (Eric Lengyel)的主要内容,如果未能解决你的问题,请参考以下文章

使用 glFrustum 创建拼接场景

级联阴影贴图无法按预期工作

Unity shader 获取深度的详细数学原理

在哪个空间做可见表面测定又如何?

奇怪的计算着色器延迟

大型 3D 场景流式传输