Rob*_*cks 6 3d rendering depth-buffer
我正在为我正在开发的游戏构建一个小型 3D 引擎。我已经整理了我的基础知识:带有背面剔除的纹理三角形。然而,深度排序被证明是一个难题。
我通过平均构成三角形面的 3 个点来计算面 Z。较长的面有时会与较小的面重叠,因为它们具有较大的 Z 值,因此会在深度排序的显示列表中上升。
我该如何解决?如果我只能在编程时获得一些实际帮助,我确信存在已知的深度排序技术。我自己构建了渲染管道,所以我可以访问所有必需的数据 - 三角形、点、纹理、UV 坐标等。
以 3D 程序呈现的大教堂

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

您需要细分三角形,使它们的大小大致相同 - 无论您是自己进行排序还是使用 z 缓冲区。当然,除非 z 缓冲区算法也为您拆分细长的三角形。
问题是,如果你有一些小的紧凑三角形和一些细长的三角形(例如),算法会经常错过对细长三角形的分类。如果您使用三角形的中点,则会有一些视点,在那里它会被视为更紧凑的“前面”,而实际上如果真的在后面。采取这个自上而下的视图,其中+代表中点。
o
-+- 1
-----+------ 2
-+- 3
*
Run Code Online (Sandbox Code Playgroud)
从寻找*到o的大的三角形(2)可被解释为在小三角形(3),因此前面的是在它的上面绘制。
如果 (2) 被分成 3 或 4 个较小的三角形,那么 z 缓冲将在更多时间工作。
使任何三角形排序算法复杂化的极端情况如下图所示:
每个三角形都位于一个三角形的前面和另一个三角形的后面。我必须在 inkscape 中做一些非常简单的技巧才能创建这个图表。
在 3D 中排列多边形并不难,这样在图形的“前面”就有一个循环。为了解决这个问题,您的算法需要能够细分三角形以打破循环。
这是 Z 缓冲区如此受欢迎的原因之一(并且它们很容易在硬件中加速)。