[英]Clipping in clipping coordinate system and normalized device coordinate system (OpenGL)
我听说应该在裁剪坐标系中进行裁剪。 这本书提出了一种情况,即从摄像机后面到查看范围内都放置一条线。 (我们将这条线定义为PQ,P位于摄像头后面)我不明白为什么会出现问题。
(这本书说完成归一化转换后,P将放置在相机前面。)
我认为在制作剪裁坐标系之前,摄影机位于原始点(0、0、0、1),因为我们进行了查看变换。 但是,在NDCS中,我无法考虑相机的位置。
我还有第二个问题。 在顶点着色器中,我们先进行模型视图转换,然后进行投影转换。 最后,我们将这些顶点输出到光栅化器。 (某些顶点的w不等于“ 1”)
在这里,我很好奇。 渲染管道将自动执行除法程序(按w)? 完成剪裁后。
有时并非所有模型都可以在屏幕上看到,主要是因为模型中的某些对象位于相机后面(或“视点”)。 这些对象被裁剪掉了。 如果看不到对象的仅一部分,则必须剪裁该部分,其余部分保持可见。
OpenGL在裁剪坐标空间(CCS)中进行裁剪。 这是一个大小为2w x 2w x 2w的立方体,其中“ w”是(4x4)x(4x1)矩阵和点相乘所得的第四个坐标。 仅仅对坐标进行比较就足以判断该点是否被裁剪。 如果该点通过测试,则其坐标除以“ w”(即“透视除法”)。 请注意,对于正交投影,“ w”始终为1,就透视而言,通常不为1。
如果模型太大,则可能要节省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.