(1)
背面剔除可以在您想要的任何地方进行。
在 3dfx 硬件上,可能还有其他只光栅化的卡,它是在窗口坐标中实现的。正如您所说,这会让您处理一些您从未使用过的顶点,但您需要将其与其他成本进行权衡。
您还可以剔除世界坐标;您知道相机的位置,因此您知道从相机到脸部的矢量——只需转到任何边缘顶点。因此,您可以针对正常情况测试其点积。
当我为基于 z80 的 micro 实现软件光栅化器时,我更进一步,将相机转换为模型空间。所以你得到了模型矩阵的逆矩阵(在这种情况下很便宜,因为它们被保证是正交的,所以转置就可以了),将它应用于相机,然后从那里剔除。它仍然是矢量差异和点积,但是如果您仅将表面法线用于剔除,那么它就不必为了相机的利益而对它们中的每一个进行变换。对于那个特定的渲染器,我可以继续从哪些面可见,以确定哪些顶点是可见的,并仅将这些顶点转换为窗口坐标。
(2)
Sutherland-Cohen 的变体是我记得最常看到的东西。您将在多边形外部进行前向扫描,依次检查每条边并进行适当调整。
因此,例如,您从点(V1、V2、V3)之间的凸多边形开始。对于每个剪裁平面,您依次执行以下操作:
for(Vn in input vertices)
{
if(Vn is on the good side of the plane)
add Vn to output vertices
if(edge from Vn to Vn+1 intersects plane) // or from Vn to 0 if this is the last edge
{
find point of intersection, I
add I to output vertices
}
}
并为每架飞机重复。如果您担心重复成本,那么您要么需要采用在面和边之间具有额外间接级别的结构,要么只保留缓存。一旦将顶点标记为输入或输出,您可能会在顶点周围进行破折号,然后缓存每条边的交点,通过键(v1,v2)进行查找。如果您为自己设置了额外的间接级别,则将结果存储在边缘对象中。