代码之家  ›  专栏  ›  技术社区  ›  Robin Rodricks

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

  •  4
  • Robin Rodricks  · 技术社区  · 14 年前

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

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

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

    在3D程序中渲染的大教堂

    alt text

    我的3D引擎渲染的大教堂

    alt text

    3 回复  |  直到 9 年前
        1
  •  4
  •   ChrisF    10 年前

    您需要对三角形进行细分,使它们的大小大致相同—不管您是自己排序还是使用z缓冲区。当然,除非Z缓冲区算法也为您分割长而细的三角形。

    问题是,如果你有一些小的紧凑三角形和一些长的细三角形(例如),那么算法会经常忽略对长的细三角形的分类。如果你使用三角形的中点,会有一个视点,当它实际上是在后面时,它会被认为是一个更紧凑的三角形的“前面”。从上往下看 + 表示中点。

                o
    
    -+-            1
    -----+------   2
             -+-   3
    
    *
    

    * o 大三角形(2)可以解释为在小三角形(3)的前面,因此可以在其上面绘制。

    如果(2)被分割成3个或4个较小的三角形,则Z缓冲会更有效。

        2
  •  4
  •   Justicle    14 年前

    您可以选择:

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

    2. 使用A Z-Buffer ,由所有人支持 图形硬件 免费。

        3
  •  1
  •   Mutant Bob    9 年前

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

    unsortable triangles

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

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

    这就是z缓冲区如此流行的原因之一(并且在硬件中很容易加速)。