Graphics 我应该在管道的哪个阶段进行剔除和剪裁,以及剪裁后如何重建三角形

Graphics 我应该在管道的哪个阶段进行剔除和剪裁,以及剪裁后如何重建三角形,graphics,3d,render,Graphics,3d,Render,我试图在软件层实现图形管道。我现在在剪辑和剔除方面有一些问题 基本上,有两个主要问题: 什么时候应该进行背面剔除?眼睛坐标、剪裁坐标还是窗口坐标?我最初在眼睛坐标系中进行剔除过程,认为这种方法可以减轻剪裁过程的负担,因为许多后向顶点已经被丢弃。但后来我意识到,这样顶点需要进行2次矩阵乘法,即左乘模型视图矩阵-->消隐-->左乘透视矩阵,这在一定程度上增加了开销 如何剪裁和重建三角形?据我所知,剪裁发生在剪裁坐标系(透视变换后),换句话说,在齐次坐标系中,通过比较每个顶点的x、y、z分量和w分量,

我试图在软件层实现图形管道。我现在在剪辑和剔除方面有一些问题

基本上,有两个主要问题:

  • 什么时候应该进行背面剔除?眼睛坐标、剪裁坐标还是窗口坐标?我最初在眼睛坐标系中进行剔除过程,认为这种方法可以减轻剪裁过程的负担,因为许多后向顶点已经被丢弃。但后来我意识到,这样顶点需要进行2次矩阵乘法,即左乘模型视图矩阵-->消隐-->左乘透视矩阵,这在一定程度上增加了开销

  • 如何剪裁和重建三角形?据我所知,剪裁发生在剪裁坐标系(透视变换后),换句话说,在齐次坐标系中,通过比较每个顶点的x、y、z分量和w分量,确定是否应该丢弃每个顶点。到目前为止还不错,对吧?但在那之后,我需要重建那些有一个或两个顶点被丢弃的三角形。我在谷歌上搜索到Liang Barsky算法在这种情况下会有所帮助,但在剪裁坐标中,我应该使用什么样的剪裁平面?我应该只记录剪裁的三角形并在NDC中重建它们吗

  • 任何想法都会有帮助。谢谢。

    (1)

    背面剔除可以在任何地方进行

    在3dfx硬件上,可能还有其他仅光栅化的卡上,它是在窗口坐标中实现的。正如您所说,这会让您处理一些从未使用过的顶点,但您需要将其与其他成本进行权衡

    您还可以在世界坐标中剔除;您知道摄影机的位置,因此您知道从摄影机到面的向量-只需转到任何边顶点。所以你可以测试它的点积和正常值

    当我为基于z80的micro实现软件光栅器时,我超越了这一步,将相机转换为模型空间。所以你得到了模型矩阵的逆矩阵(在这种情况下很便宜,因为它们保证是正交的,所以转置就可以了),把它应用到相机上,然后从那里剔除。它仍然是一个矢量差和一个点积,但是如果你只使用曲面法线进行消隐,那么就不用为了相机的利益而变换它们中的每一个。对于那个特定的渲染器,我能够从哪些面可见向前工作,以确定哪些顶点可见,并仅将这些顶点转换为窗口坐标

    (二)

    萨瑟兰·科恩的变种是我记得最常看到的。你需要在多边形的外侧做一个正向扫描,依次检查每一条边并进行适当的调整

    例如,从点(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)进行查找。如果您已经为自己设置了额外的间接级别,请将结果存储在edge对象中。

    谢谢@Tommy的建议。那么什么时候做萨瑟兰-科恩测试,计算边和平面的交点呢?剪裁坐标?假设一个三角形TriA(v0,v1,v2)在剪裁坐标系中,我将每个顶点的x,y,z与其w值进行比较,结果表明v1,v2应该被丢弃。问题来了,我该怎么办?将边01和边02的三角形和计算机交点标记到某个平面上?我想还有各种各样的答案,但我个人通常会在变换后将其剪辑到相机空间中,以删除
    x>z
    y<-z
    z<1
    ,等等。因此,你需要为变换付费,但不需要为投影付费。在一个非常小的系统上,这是很好的,因为它让您为一些乘法付费,但避免了一些冗余的除法,当然,在旧硬件上,这些除法的成本过高。