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

时间:2015-07-20 09:59:36

标签: java algorithm sorting 3d

我正在从头开始用Java创建3D渲染器而没有外部库。当我试图优化时,我想知道一般/平均答案是否Painter的算法比Z-Buffering更快。假设我正在渲染一个更快的同一个多维数据集。但我不想让相交的多边形陷入混乱,所以我可能想要实现Newell的版本的Painter算法,该算法可以切割多边形,使它们不会相交并陷入困境。 / p>

我可以获得一个平均更快渲染单个立方体的顺序:

Painter's Algorithm

Newell's Painter's Algorithm

Z-Buffering

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

1 个答案:

答案 0 :(得分:4)

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

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

Z-Buffering更适合:

  • 高对象/多边形计数
  • 动态场景(物体或相机移动/旋转)

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

Z-Sorting更适合:

  • (相对)静态场景或非常低的对象/多边形计数
  • 如果可以处理的内存非常少(在8位计算机上,大多数 3D 应用使用Z-sorting,因为Z-buffer没有内存

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

  • 透明多边形需要Z-sorting

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

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

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

不支持