【问题标题】:How do I Z-sort triangles for a 3D engine?如何对 3D 引擎的三角形进行 Z 排序?
【发布时间】:2011-04-13 23:00:23
【问题描述】:

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

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

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

3D 程序渲染的大教堂

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

【问题讨论】:

    标签: 3d rendering depth-buffer


    【解决方案1】:

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

    问题在于,如果您有一些小的紧凑三角形和一些细长的三角形(例如),该算法将经常无法对细长的三角形进行分类。如果你使用三角形的中点,就会有一些视点,它会被认为是一个更紧凑的“前面”,而实际上如果真的在后面的话。以+ 代表中点的自上而下视图为例。

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

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

    如果 (2) 被分割成 3 或 4 个较小的三角形,那么 z 缓冲的工作时间会更长。

    【讨论】:

    • 有什么方法可以让 Z 排序例程考虑三角形区域,而不必拆分 tris?
    • 不正确。这正是 Z-buffering 解决的问题。 Z 缓冲是按像素计算的,并且与多边形大小无关(它恰好在管道的下游甚至不知道)。您描述的问题仅适用于多边形排序,或者如果您正在渲染非透明多边形。精度问题与 z-buffering 相关,这里有一个很好的介绍:sjbaker.org/steve/omniv/love_your_z_buffer.html
    • Justicle 说了什么。此外,如果您需要 z 排序(例如透明度),一种计算有效的 z 排序方法是使用 BSP 树。
    • @Kos - 如果你有一个静态场景,那么 BSP 树是正确的选择。这涵盖了移动物体的一般情况。
    • Z 缓冲仅在所有三角形大小相似的情况下才有效。如果任何一个又长又薄,你就会遇到这个问题。
    【解决方案2】:

    您的选择是:

    1. 细分你的网格,这样你 可以可靠地对每个多边形进行排序(但是 仍然有可怕的边缘情况 您可能会或可能不会看到)。

    2. 使用Z-Buffer,所有人都支持 图形硬件,本质上是 免费。

    【讨论】:

      【解决方案3】:

      使任何三角形排序算法复杂化的极端情况如下图所示:

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

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

      这是 Z 缓冲区如此受欢迎的原因之一(而且它们很容易在硬件中加速)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-26
        • 2018-10-16
        • 2018-12-23
        • 2018-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多