PowerVR GPU如何提供深度缓冲?

时间:2012-04-09 15:45:48

标签: ios graphics opengl-es powervr-sgx

iOS设备使用PowerVR图形架构。 PowerVR架构是tile-based deferred rendering模型。该模型的主要好处是它不使用深度缓冲区。

但是,我可以访问iOS设备上的深度缓冲区。具体来说,我可以使用屏幕外帧缓冲区对象将深度缓冲区转换为颜色纹理并渲染它。

如果PowerVR架构不使用深度缓冲区,那我怎么能渲染深度缓冲区呢?

3 个答案:

答案 0 :(得分:2)

基于平铺的延迟渲染 - 正如名称所暗示的那样 - 在逐个拼贴的基础上工作。屏幕的每个部分都被加载到内部缓存中,再次处理和写出。硬件采用与当前图块重叠的三角形列表和当前深度值,并从中获得一组新的颜色和深度,然后再将这些全部写出来。因此,一个完全愚蠢的GPU可以对每个三角形的每个相关深度缓冲值进行一次读取和一次写入,而PowerVR将对每批几何进行一次读取和一次写入,其中光线投射式算法在其间进行其余操作。 / p>

实际上不可能在'纯'基于图块的延迟渲染器上实现OpenGL,因为深度缓冲区需要是可读的。使深度缓冲区写入通常也没有效率,因为颜色缓冲区在任何时候都是可读的(显式地通过glReadPixels或隐式地根据您的操作系统机制提供帧缓冲区),意思是硬件可能必须绘制一个场景,然后在其上绘制更多。

答案 1 :(得分:1)

PowerVR确实使用深度缓冲区,但其方式与常规(立即模式渲染)GPU不同

基于Tile的差异渲染的不同部分意味着首先处理给定场景的三角形(阴影,变换剪裁等)并保存到中间缓冲区中。只有在处理完整个场景之后,才会逐个渲染切片。

将所有处理过的三角形放在一个缓冲区中允许硬件执行隐藏曲面移除 - 删除最终被其他三角形隐藏/透过的三角形。这显着减少了渲染三角形的数量,从而提高了性能并降低了功耗。

隐藏表面移除通常使用称为Tab缓冲区和深度缓冲区的东西。 (两者都是小型片上存储器,因为它们一次存储一块)

不确定为什么说PowerVR不使用深度缓冲区。我的猜测是,它只是一种“营销”方式,表示不需要执行昂贵的写入和从系统内存中读取以执行深度测试。

P.S

只是为了补充Tommy的答案:基于图块的不同渲染的主要好处是:

  1. 由于片段一次处理,因此从快速片上存储器执行所有颜色/深度/模板缓冲区读取和写入。虽然每个磁贴仍然需要将颜色缓冲区读/写到系统内存,但在许多情况下,深度和模板缓冲区只有在以后需要时才需要写入系统内存(如用户用例)。系统内存流量是功耗的重要来源......因此您可以看到它如何降低功耗。
  2. 不同的渲染可以隐藏表面去除。较少渲染的三角形意味着较少的片段处理,意味着较少的纹理内

答案 2 :(得分:1)

基于图块的渲染器确实不需要传统的深度缓冲区才能工作。

TBR将屏幕分割成瓷砖,并使用快速片上存储器完全呈现此图块的内容,以存储临时颜色和深度。然后,当图块完成时,最终值将移动到实际的帧缓冲区。但是,深度缓冲区中的深度值传统上是临时的,因为它们仅用作隐藏表面算法。然后,在渲染图块之后,可以完全丢弃这种情况下的深度值。

这意味着有效的基于图块的渲染器在较慢的视频内存中并不需要全屏深度缓冲,从而节省了带宽和内存。

Metal API很容易公开此功能,允许您将深度缓冲区的storeAction设置为“不关心”值,这意味着它不会将生成的深度值备份到主内存中。

这种情况的例外是渲染后可能需要深度缓冲区内容(即对于延迟渲染器或某些使用深度值操作的算法的源)。在这种情况下,硬件必须确保深度值存储在帧缓冲区中供您使用。