Z 缓冲通常比 Painter 算法更快吗?

Hyd*_*den 4 java sorting algorithm 3d

我正在用 Java 从头开始​​制作一个 3D 渲染器,没有外部库。当我尝试优化时,我想知道画家算法是否比 Z 缓冲更快的一般/平均答案。假设我渲染一个相同的立方体会更快。但我不希望相交的多边形变得混乱,所以我可能想实现纽厄尔版本的画家算法来切割多边形,这样它们就不会相交和混乱。

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

画家算法

纽厄尔画家算法

Z 缓冲

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

Spe*_*tre 5

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

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

Z-Buffering更适合:

  • 高对象/多边形数量

  • 动态场景(物体或相机正在移动/旋转)

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

Z-Sorting更适合:

  • (相对)静态场景或非常低的对象/多边形数量

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

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

  • 透明多边形需要Z排序

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

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

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