为什么深度缓冲比深度纹理更快?

时间:2017-07-26 08:00:14

标签: opengl depth-buffer

This tutorial on shadow-mapping in OpenGL简要提到了使用深度缓冲区和深度纹理之间的区别(编辑:存储每个像素深度信息以进行深度测试或其他目的,例如阴影贴图),并说明:

  

深度纹理。比深度缓冲区慢,但您可以稍后在着色器中对其进行采样

然而,这让我想知道为什么会这样。毕竟,两者似乎都只是一个包含一些数据的二维数组,而微软在图形上的注释定义用非常相似的术语定义它们(这些注释在注释中指出,而不是在OpenGL上但是另一个图形引擎,但深度缓冲区/纹理的目的似乎非常相似 - 我还没有找到对OpenGL深度缓冲区/纹理的两个相同的描述 - 因此我决定保留这些文章。如果有人链接到描述OpenGL中深度缓冲和深度纹理的文章,欢迎您将其发布在评论中)

A depth buffer contains per-pixel floating-point data for the z depth of each pixel rendered.

A depth texture, also known as a shadow map, is a texture that contains the data from the depth buffer for a particular scene

当然,这两种方法之间存在一些差异 - 特别是深度纹理可以在以后采样,与深度缓冲区不同。
尽管存在这些差异,但我无法理解为什么深度缓冲区应该比深度纹理更快使用,因此我的问题是:为什么这两种存储相同数据的方法不能同样快速(编辑:使用时)用于存储深度测试的深度数据。)

1 个答案:

答案 0 :(得分:1)

通过“深度缓冲”,我将假设您的意思是“具有深度格式的渲染缓冲区”。

深度渲染缓冲区渲染速度可能比深度纹理更快的原因包括:

  1. 深度渲染缓冲区可以存在于不可着色器访问的专用内存中,因为实现知道您无法从着色器访问它。
  2. 深度渲染缓冲区可能具有深度纹理不能具有的特殊格式或布局,因为纹理必须是可着色器访问的。这可能包括Hi-Z / Hierarchical-Z等等。
  3. #1倾向于在基于磁贴的体系结构上出现。如果你做得对,你可以将深度渲染缓冲区完全保留在磁贴内存中。这意味着,在渲染操作之后,不需要将其复制到主存储器。相比之下,对于深度纹理,实现不能确定您不需要将其复制出来,因此必须这样做才能保证安全。

    请注意,此列表纯粹是推测。除非您实际对其进行了分析,或者具有一些特定的硬件知识(如在TBR案例中),否则没有理由认为性能存在任何实质性差异。