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

问题描述 投票:0回答:3

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

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

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

3D 程序渲染的大教堂

alt text

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

alt text

3d rendering depth-buffer
3个回答
6
投票

您需要细分三角形,使它们的大小大致相同 - 无论您是自己排序还是使用 z 缓冲区。 当然,除非 z 缓冲区算法也为您分割细长三角形。 在这种情况下,您不应该看到此问题。

问题是,如果你有一些紧凑的小三角形和一些细长的三角形(例如),算法将经常错过对细长三角形的分类。如果您使用三角形的中点,则某些视点将被视为更紧凑的视点的“前面”,而实际上它实际上位于后面。采取这个自上而下的视图,其中

+
代表中点。

            o

-+-            1
-----+------   2
         -+-   3

*

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

如果 (2) 被分割成 3 或 4 个较小的三角形,那么 z 缓冲将在更多时候发挥作用。


6
投票

您的选择是:

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

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


4
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.