在图形管线中,剪裁在哪个阶段执行?

4

我正在用C++编写软渲染器来学习,但遇到了一点问题。我不确定剪裁是在何时进行的。有些资料说它会在透视投影矩阵应用后但在透视除法之前(仍处于三维空间)的剪裁空间中发生。其他资料则说要在2D空间(透视除法后)使用像Cohen-Sutherland线段剪裁算法这样的算法进行剪裁。如果我应该在3D空间中剪裁,那么深度缓冲区只用于确定对象栅格化的顺序,还是必须在二维空间中进行剪裁,并且还要防止将超出z缓冲区中-1的点进行栅格化?

基本上,关于这方面的信息不是非常清楚,而我也没有看到过如何在齐次剪裁空间中进行剪裁。有人说你应该这样做,但却没有人展示如何操作。

2个回答

5

2
那只是GL规范所说的。真正的硬件将尽可能通过使用保护带来避免剪裁,并且可能会以与官方规范不同得多的方式进行剪裁。 - derhass

2
一些来源谈论在透视投影矩阵应用之后,但在进行透视除法之前(因此仍处于3D空间)发生的剪裁。其他来源则讨论使用Cohen-Sutherland线段剪裁等算法在2D空间(透视除法之后)进行剪裁。 传统的剪裁算法,如Cohen-Sutherland线段剪裁或Sutherland-Hodgman多边形剪裁可能被描述为2D,但它们原则上也适用于3D。 实际上,在齐次剪辑空间中剪切的信息并不清楚,也没有人展示如何进行齐次剪辑空间的剪辑。 这自然地遵循齐次空间的定义和剪辑条件 -w <= x,y,z <= w。考虑剪辑一条直线线段AB(多边形剪辑基本上可以实现为多边形边缘上的一系列线剪辑)。Cohen-Sutherland线段剪辑算法在齐次空间中显然有所扩展,只需将-ww作为每个维度中的观察体积边界即可。对于实际的交点计算,我们需要搜索一个新的齐次点C =(C_x, C_y, C_z, C_w)^T,使得C位于交点平面上并且在AB上,因此我们需要找到一个t来进行计算。
C = t * A + (1-t) * B

假设我们想要针对近裁剪面进行剪裁,即z = -w
为了使C位于该平面上,必须满足C_z = -C_w。这留下了一个简单的线性方程组:
C_x = t * A_x + (1-t) * B_x
C_y = t * A_y + (1-t) * B_y
C_z = t * A_z + (1-t) * B_z = -t * A_w - (1-t)*B_w
C_w = t * A_w + (1-t) * B_w 

C_z 的方程式可以得出:

t = (B_z + B_w) / ( (B_z + B_w) - (A_z + A_w))

请注意,这个t也可以用于插值C的所有相关顶点属性。即使在透视扭曲的情况下,线性插值也是完全足够的,因为我们在这里进行透视划分之前,整个透视变换对于我们所工作的4D空间来说是完全仿射的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接