繁体   English   中英

裁剪裁剪坐标系和归一化设备坐标系(OpenGL)

[英]Clipping in clipping coordinate system and normalized device coordinate system (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,并让其处理这些特殊情况。

您已定义一个仅在其中可见对象的卷。 该体积由六个平面定义。 让我们将自己放在摄影机中,然后看一下该体积:如果您的投影是透视图,则这六个平面将构成一个“圆锥台”,即一种截顶的金字塔。 如果投影是正交的,则这些平面将形成平行六面体。

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

如果一个平面由等式Ax + By + Cz + D = 0定义,则到p1,p2,p3的有符号距离为(Ap1 + Bp2 + Cp3 + D)/ sqrt(A A + B B + C * C)。 您只需要符号,因此不必费心计算分母。

现在,您拥有了所有工具。 如果您知道在“摄像机视图”中的飞机,则可以计算六个距离并修剪或不修剪顶点。 但这可能是一项昂贵的操作,因为您必须将顶点共余线从模型空间转换为相机(视图)空间,这是ViewModel矩阵计算。 以相同的成本,您可以使用预先计算的ProjectionViewModel矩阵来获取CCS坐标,将其与CCS多维数据集的大小“ 2w”相比要容易得多。

有时,您不想跳过某些顶点,不是因为它们被裁剪,而是因为它们的深度违反了您正在使用的条件。 在这种情况下,CCS不是正确的处理空间,因为Z坐标已转换为[-w,w]范围,所以深度会以某种方式“丢失”。 相反,您可以在“视图空间”中进行剪辑测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM