我正在为我正在开发的游戏构建一个小型 3D 引擎。我已经整理好了我的基础知识:带有背面剔除的纹理三角形。然而,深度排序被证明是一个难题。
我通过对构成三角形面的 3 个点进行平均来计算面 Z。较长的面有时会与较小的面重叠,因为它们具有较大的 Z 值,因此在深度排序显示列表中上升。
我该如何解决这个问题?如果我只能在编程时获得一些实际帮助,我确信存在已知的深度排序技术。我自己构建了渲染管道,因此我可以访问所有必需的数据 - 三角形、点、纹理、UV 坐标等。
3D 程序渲染的大教堂
在我的 3D 引擎中渲染的大教堂
您需要细分三角形,使它们的大小大致相同 - 无论您是自己排序还是使用 z 缓冲区。 当然,除非 z 缓冲区算法也为您分割细长三角形。 在这种情况下,您不应该看到此问题。
问题是,如果你有一些紧凑的小三角形和一些细长的三角形(例如),算法将经常错过对细长三角形的分类。如果您使用三角形的中点,则某些视点将被视为更紧凑的视点的“前面”,而实际上它实际上位于后面。采取这个自上而下的视图,其中
+
代表中点。
o
-+- 1
-----+------ 2
-+- 3
*
从
*
到o
看,大三角形(2)可以被解释为位于小三角形(3)的前面,因此被绘制在它的上面。
如果 (2) 被分割成 3 或 4 个较小的三角形,那么 z 缓冲将在更多时候发挥作用。
您的选择是:
细分您的网格,以便您 可以可靠地对每个多边形进行排序(但是 仍然存在可怕的边缘情况 您可能会或可能不会看到)。
使用Z-Buffer,所有支持 图形硬件本质上是 免费。