Graphics 我应该在管道的哪个阶段进行剔除和剪裁,以及剪裁后如何重建三角形
我试图在软件层实现图形管道。我现在在剪辑和剔除方面有一些问题 基本上,有两个主要问题:Graphics 我应该在管道的哪个阶段进行剔除和剪裁,以及剪裁后如何重建三角形,graphics,3d,render,Graphics,3d,Render,我试图在软件层实现图形管道。我现在在剪辑和剔除方面有一些问题 基本上,有两个主要问题: 什么时候应该进行背面剔除?眼睛坐标、剪裁坐标还是窗口坐标?我最初在眼睛坐标系中进行剔除过程,认为这种方法可以减轻剪裁过程的负担,因为许多后向顶点已经被丢弃。但后来我意识到,这样顶点需要进行2次矩阵乘法,即左乘模型视图矩阵-->消隐-->左乘透视矩阵,这在一定程度上增加了开销 如何剪裁和重建三角形?据我所知,剪裁发生在剪裁坐标系(透视变换后),换句话说,在齐次坐标系中,通过比较每个顶点的x、y、z分量和w分量,
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)进行查找。如果您已经为自己设置了额外的间接级别,请将结果存储在edge对象中。谢谢@Tommy的建议。那么什么时候做萨瑟兰-科恩测试,计算边和平面的交点呢?剪裁坐标?假设一个三角形TriA(v0,v1,v2)在剪裁坐标系中,我将每个顶点的x,y,z与其w值进行比较,结果表明v1,v2应该被丢弃。问题来了,我该怎么办?将边01和边02的三角形和计算机交点标记到某个平面上?我想还有各种各样的答案,但我个人通常会在变换后将其剪辑到相机空间中,以删除
x>z
,y<-z
,z<1
,等等。因此,你需要为变换付费,但不需要为投影付费。在一个非常小的系统上,这是很好的,因为它让您为一些乘法付费,但避免了一些冗余的除法,当然,在旧硬件上,这些除法的成本过高。