Z-Buffering 通常比 Painter 算法更快吗?

Is Z-Buffering generally faster than the Painter's Algorithm?

我正在 Java 中从头开始制作 3D 渲染器,没有外部库。当我尝试优化时,我想知道 general/average 答案 Painter 算法是否比 Z-Buffering 更快。假设我正在渲染一个相同的立方体,这样会更快。但我不希望相交的多边形弄乱,所以我可能想实施 Newell 版的 Painter 算法,该算法切割多边形,这样它们就不会相交和弄乱。

那么我可以得到渲染单个立方体的平均速度更快的顺序吗:

Painter's Algorithm

Newell's Painter's Algorithm

Z-Buffering

另外,如果有人有任何其他好的建议我可以使用吗?

在计算机图形学中,画家算法称为Z-Sorting

有时速度更快,有时则不然。这取决于您有多少对象,您渲染的分辨率有多大以及您需要的 Z 坐标精度。

Z-Buffering 更适合:

  • 高object/polygon计数

  • 动态场景(物体或相机是moving/rotating)

    它需要与渲染图像具有相同分辨率的额外缓冲区,并且它对每个片段执行单一条件(每个多边形的渲染像素,甚至是看不见的像素)。渲染后,每个可见像素的 3D z 坐标可供使用,这是许多高级渲染技术所必需的。

Z-Sorting 更适合:

  • (相对)静态场景还是很低object/polygon计数

  • 如果可用内存很少(在 8 位计算机上,大多数 3D 应用程序使用 Z-sorting,因为 Z-buffer)

    它需要索引缓冲区来存储所有 object/polygon 索引,并且它会在每个场景变化时执行排序(按 Z 坐标对许多对象进行排序可能会很慢)。现在使用它是因为:

  • 透明多边形需要 Z 排序

  • 如果程序出于其他原因已经有 Z 排序的场景,那么它会利用它

有时这两种技术结合在一起

特别是对于 Z 坐标的高动态范围,因为标准 Z 缓冲区(24/32 位宽)在整个范围内的分辨率非常差。它可以通过使用 Z-buffer 的线性或对数刻度来部分解决,但是如果您需要在整个范围内定义 accuracy/resolution,则需要使用某种与 Z 排序的组合并组合更多 frustrums 一起使用或使用当前 HW

不支持的具有高动态范围的自定义 Z-Buffer