【发布时间】:2015-12-21 02:28:57
【问题描述】:
假设设备支持 GL_OES_depth_texture 扩展,在将存储或纹理附加到 FBO 时,在性能或内存消耗方面是否有任何差异?
【问题讨论】:
假设设备支持 GL_OES_depth_texture 扩展,在将存储或纹理附加到 FBO 时,在性能或内存消耗方面是否有任何差异?
【问题讨论】:
您的帖子标有 OpenGLES 2.0,这很可能意味着您在谈论移动设备。
许多 Android 移动 GPU 和所有 iOS GPU 都基于基于 Tile 的延迟渲染器 - 在此设计中,所有渲染都是使用特殊的快速片上内存对小型(例如 32x32)图块完成的。在典型的渲染过程中,通过正确调用 glClear 和 glDiscardFramebufferEXT,设备无需将深度缓冲区从片上内存复制到存储中。
但是,如果您使用深度纹理,则此副本是不可避免的。将屏幕大小的深度纹理从片上存储器传输到纹理的成本非常高。但是,我希望在渲染过程中绘制调用的渲染成本不会受到影响。
在内存使用方面,它更具推测性。如果您没有使用深度纹理并且您正确使用 glClear 和 glDiscardFramebufferEXT,那么聪明的驱动程序可能根本不需要为 TBDR GPU 上的深度缓冲区分配任何内存,因为您的深度缓冲区在任何时候都没有由任何存储支持。驱动程序是否真的这样做是驱动程序实现内部的,您必须询问驱动程序作者(Apple/Imagination Technologies/ARM 等)。
最后,深度缓冲区格式可能必须进行一些重新配置才能用作深度纹理,这可能意味着它会使用更多内存并影响效率。不过我认为这不太可能。
TLDR:除非您确实需要,否则不要使用深度纹理,但如果您确实需要,那么我认为它不会对您的渲染性能产生太大影响。主要成本在复制深度数据的带宽上。
【讨论】: