如何对3D引擎的三角形进行Z排序?

如何对3D引擎的三角形进行Z排序?,3d,rendering,depth-buffer,3d,Rendering,Depth Buffer,我正在为我正在开发的游戏构建一个小型3D引擎。我已经对我的基础知识进行了分类:带背面剔除的纹理三角形。然而,深度排序被证明是一个困难的问题 我通过平均出组成三角形面的3个点来计算面Z。较长的面有时与较小的面重叠,因为它们具有较大的Z值,因此在深度排序的显示列表中上升 我该如何解决这个问题?如果我只能在编程时得到一些实用的帮助,我确信有一些已知的深度排序技术。我自己构建了渲染管道,因此可以访问所有必需的数据-三角形、点、纹理、UV坐标等 在3D程序中渲染的教堂 在我的3D引擎中渲染 您可以选择:

我正在为我正在开发的游戏构建一个小型3D引擎。我已经对我的基础知识进行了分类:带背面剔除的纹理三角形。然而,深度排序被证明是一个困难的问题

我通过平均出组成三角形面的3个点来计算面Z。较长的面有时与较小的面重叠,因为它们具有较大的Z值,因此在深度排序的显示列表中上升

我该如何解决这个问题?如果我只能在编程时得到一些实用的帮助,我确信有一些已知的深度排序技术。我自己构建了渲染管道,因此可以访问所有必需的数据-三角形、点、纹理、UV坐标等

在3D程序中渲染的教堂

在我的3D引擎中渲染


您可以选择:

  • 细分网格,以便 能够可靠地对每个多边形进行排序(但是 还有可怕的边缘案件 你可能看到,也可能看不到)

  • 使用一个由所有人支持的 图形硬件和基本上是 免费的


  • 您需要对三角形进行细分,使其大小大致相同,而不管您是自己排序还是使用z缓冲区。当然,除非z-buffer算法也会为您拆分细长三角形

    问题是,如果你有一些小的紧凑三角形和一些长而薄的三角形(例如),那么算法将经常错过对长而薄三角形的分类。如果你使用三角形的中点,会有一些观察点,在那里它会被视为一个更紧凑的三角形的“前面”,而实际上如果它真的在后面。在这个自上而下的视图中,
    +
    表示中点

                o
    
    -+-            1
    -----+------   2
             -+-   3
    
    *
    
    *
    o
    可以将大三角形(2)解释为位于小三角形(3)的前面,因此可以在其上面绘制


    如果(2)被分成3或4个较小的三角形,则z缓冲将在更多时间内工作。

    使任何三角形排序算法复杂化的角点情况由下图表示:

    每个三角形位于一个三角形的前面,另一个三角形的后面。为了创建这个图表,我不得不在inkscape中做一些非常简单的技巧

    在3D中排列多边形并不难,这样在“前面”图形中就有一个循环。要解决这个问题,您的算法需要能够细分三角形以打破循环


    这就是Z缓冲区如此流行的原因之一(而且它们在硬件上很容易加速)。

    有没有办法使Z排序例程偏向于考虑三角形区域,而不必拆分tris?不正确。这正是Z缓冲解决的问题。Z缓冲是每像素的,并且与多边形大小无关(它恰好在管道下游很远的地方才知道)。您描述的问题仅适用于多边形排序,或者在渲染非不透明多边形时。精度问题与z缓冲相关,这里有一个很好的介绍:Justicle所说的。此外,如果需要z排序(例如透明度),计算效率高的z排序方法是使用BSP树。@Kos-如果有静态场景,则使用BSP树是正确的方法。这涵盖了移动对象的一般情况。仅当所有三角形的大小相似时,Z缓冲才有效。如果有人又长又瘦,你就会遇到这个问题。