2010-09-17 52 views
4

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

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

我该如何解决这个问题?如果我只能在编程时获得一些实际的帮助,我肯定有深度的排序技术。我已经建立了渲染管线自己,所以我有机会获得所有需要的数据 - 三角形,点,纹理,UV坐标等

大教堂在3D节目

alt text

呈现大教堂呈现在我的3D引擎

alt text

回答

4

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

问题是,如果你有一些小的紧凑三角形和一些细长的三角形(例如),该算法会错过对较长的三角形进行更频繁的分类。如果使用三角形的中点,则会出现视点,在实际上如果真的落后,它将被视为更紧凑的“前面”。采取这种自顶向下的观点,其中+代表中点。

  o 

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

* 

*o大三角形寻找(2)可被解释为在小三角形(3),因此可以在它的上面画出的前面之中。如果(2)被分割成3或4个较小的三角形,那么z-缓冲将更多的时间工作。

+0

有没有什么办法可以使Z排序例程偏向于考虑三角形区域,而不必拆分tris? – 2010-09-18 17:58:22

+2

不正确。这正是Z缓冲解决的问题。 Z缓冲是每个像素和独立的多边形大小(它发生在管道甚至知道)。 您描述的问题只适用于多边形排序,或者如果您渲染非不透明的多边形。精度问题与z缓冲有关,这里有一个很好的介绍:http://www.sjbaker.org/steve/omniv/love_your_z_buffer.html – Justicle 2010-09-18 22:11:52

+0

Justicle说。此外,如果您需要z-排序(例如透明度),z-sort的计算有效方法是使用BSP树。 – Kos 2011-11-21 18:08:46

4

你的选择是要么:

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

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

1

该复杂任何三角形的排序算法由下面的图表示的角的情况下:

三角形的unsortable triangles

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

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

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