如何对3D引擎进行Z排序?

时间:2010-09-17 22:18:37

标签: 3d rendering depth-buffer

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

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

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

以3D程序呈现的大教堂

alt text

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

alt text

3 个答案:

答案 0 :(得分:4)

您可以选择:

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

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

答案 1 :(得分:4)

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

问题在于,如果你有一些小的紧凑三角形和一些细长的三角形(例如),算法将会错过很长时间的细长分类。如果你使用三角形的中点,那么它将被视为一个更紧凑的“在前面”的视点,实际上如果真的落后了。从上到下的视图中+代表中点。

            o

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

*

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

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

答案 2 :(得分:1)

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

unsortable triangles

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

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

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