在图形管线中的哪个阶段执行剪切?

时间:2020-03-29 05:19:17

标签: c++ opengl graphics rendering clipping

出于学习目的,我正在用C ++编写一个软渲染器,但我已经遇到了一些困难。我不知道是否丢失了某些内容,但是不确定何时执行剪切。一些消息来源谈到它是在应用透视投影矩阵之后但在透视划分之前(因此仍在3D空间中)在剪辑空间中发生的。其他消息来源也谈到了使用诸如Cohen-Sutherland线裁剪算法之类的算法在2D空间(在透视划分之后)执行该操作。如果应该在3D空间中进行剪切,那么深度缓冲区是否仅用于确定栅格化对象的顺序,或者我必须在2D中进行剪切但还可以防止z缓冲区中超过-1的点栅格化?

基本上,关于此的信息不是很清楚,我还没有真正看到如何在同质的剪辑空间中进行剪辑。据说您应该这样做,但是没人显示如何做。

2 个答案:

答案 0 :(得分:5)

Vertex Post-ProcessingRendering Pipeline阶段进行剪切。

原语会根据其homogeneous的顶点gl_Positionperspective divide之前的{-{3}}裁剪空间位置而被裁剪。裁剪规则是:

-w <=  x, y, z  <= w.

有关详细信息,请参见 OpenGL 4.6 API Core Profile Specification - 13.7 Primitive Clipping

答案 1 :(得分:2)

一些消息源谈到它是在应用透视投影矩阵之后但在透视划分之前(因此仍在3D空间中)在剪辑空间中发生的。其他消息来源则谈到在二维空间(透视划分后)中使用Cohen-Sutherland线裁剪

诸如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空间。