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