6

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

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

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

以 3D 程序渲染的大教堂

替代文字

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

替代文字

4

3 回答 3

6

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

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

            o

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

*

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

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

于 2010-09-18T14:29:46.043 回答
5

您的选择是:

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

  2. 使用Z-Buffer,它受所有图形硬件支持并且基本上是免费的。

于 2010-09-17T22:25:07.390 回答
2

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

无法排序的三角形

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

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

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

于 2015-09-08T17:30:52.243 回答