出于学习目的,我正在用C ++编写一个软渲染器,但我已经遇到了一些困难。我不知道是否丢失了某些内容,但是不确定何时执行剪切。一些消息来源谈到它是在应用透视投影矩阵之后但在透视划分之前(因此仍在3D空间中)在剪辑空间中发生的。其他消息来源也谈到了使用诸如Cohen-Sutherland线裁剪算法之类的算法在2D空间(在透视划分之后)执行该操作。如果应该在3D空间中进行剪切,那么深度缓冲区是否仅用于确定栅格化对象的顺序,或者我必须在2D中进行剪切但还可以防止z缓冲区中超过-1的点栅格化?
基本上,关于此的信息不是很清楚,我还没有真正看到如何在同质的剪辑空间中进行剪辑。据说您应该这样做,但是没人显示如何做。
答案 0 :(得分:5)
在Vertex Post-Processing的Rendering Pipeline阶段进行剪切。
原语会根据其homogeneous的顶点gl_Position
在perspective 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)线裁剪算法可以轻松地扩展到同质空间,您只需将-w
和w
应用于每个维度中的可视范围边界即可。对于实际的相交计算,我们需要搜索一个新的同质点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空间。