在剪裁坐标系和标准化设备坐标系(OpenGL)中进行剪裁



我听说裁剪应该在裁剪坐标系中进行。这本书提出了一种情况,即从摄像机后面到观看音量之间都有一条线。(我们将这条线定义为PQ,P在摄像机点后面)我不明白为什么这会成为一个问题。

(书中说,在完成归一化转换后,p将被放置在相机前。)

我认为在制作裁剪坐标系之前,相机在原点(0,0,0、1)上,因为我们做了观察变换。然而,在NDCS中,我无法考虑相机的位置。

我还有第二个问题。在顶点着色器中,我们先进行模型视图变换,然后进行投影变换。最后,我们将这些顶点输出到光栅化器。(某些顶点的w不等于'1')

在这里,我有好奇心。渲染管道将自动执行分割过程(按w)?剪切完成后。

有时并不是所有的模型都能在屏幕上看到,主要是因为其中的一些对象位于相机后面(或"视点")。这些对象将被剪裁掉。如果只能看到对象的一部分,则必须仅剪裁该部分,使其余部分保持可见状态。

OpenGL剪辑

OpenGL在剪裁坐标空间(CCS)中进行这种剪裁。这是一个大小为2w x 2w x 2w的立方体,其中"w"是(4x4)x(4x1)矩阵和点相乘得到的第四个坐标。仅仅比较一下坐标就足以判断该点是否被剪裁。如果该点通过测试,则其坐标除以"w"(即所谓的"透视分割")。注意,对于正交投影,"w"总是1,而对于透视,它通常不是1。

CPU剪辑

如果模型太大,也许你想节省GPU资源或提高帧速率。所以你决定跳过那些无论如何都会被剪裁的对象。然后你自己(在CPU上)计算,只将通过测试的顶点发送给GPU。请注意,某些对象的某些顶点可能已剪裁,而同一对象的其他顶点可能未剪裁。也许你确实把它们发送到GPU,让它处理这些特殊情况。

您已经定义了一个体积,其中只能看到里面的对象。该体积由六个平面定义。让我们把自己放在相机里,看看这个体积:如果你的投影是透视的,六个平面会形成一个"fustrum",一种截锥。如果你的投影是正交的,那么这些平面就形成了一个平行六面体。

为了剪裁或不剪裁顶点,必须使用从顶点到这六个平面中每一个的距离。您需要一个带符号的距离,这意味着符号告诉您从顶点可以看到平面的哪一侧。如果六个距离符号中的任何一个不是正确的,则会丢弃、剪裁顶点。

如果平面由方程Ax+by+Cz+D=0定义,则与p1、p2、p3的有符号距离为(Ap1+Bp2+Cp3+D)/sqrt(aa+BB+C*C)。你只需要符号,所以不用麻烦计算分母。

现在你有了所有的工具。如果您知道"摄影机视图"上的平面,则可以计算六个距离并剪裁或不剪裁顶点。但考虑到必须将顶点坐标从模型转换到摄影机(视图)空间,即ViewModel矩阵计算,这可能是一项昂贵的操作。在相同的成本下,您可以使用预先计算的ProjectionViewModel矩阵来获得CCS坐标,这更容易与CCS立方体的大小"2w"进行比较。

有时,您希望跳过某些顶点,不是因为它们被剪裁,而是因为它们的深度破坏了您正在使用的标准。在这种情况下,CCS不是合适的工作空间,因为Z坐标被转换为[-w,w]范围,深度在某种程度上"丢失"了。相反,您可以在"视图空间"中进行剪辑测试。

相关内容

  • 没有找到相关文章

最新更新