为什么深度缓冲区比深度纹理更快?
Why is depth buffers faster than depth textures?
This tutorial on shadow-mapping in OpenGL 简要提到了使用深度缓冲区和深度纹理之间的区别(编辑:为深度测试或其他目的存储每个像素的深度信息,例如阴影映射)通过声明:
Depth texture. Slower than a depth buffer, but you can sample it later in your shader
然而,这让我想知道为什么会这样。毕竟,两者似乎只不过是一个包含一些数据的二维数组,并且 Microsoft 图形注释上的定义以非常相似的术语定义它们(这些注释在评论中指出,不是在 OpenGL 上而是在另一个图形引擎,但 depth-buffers/-textures 的目的似乎非常相似——我还没有找到对 OpenGL depth-buffers/-textures 两者的相同描述——出于这个原因,我决定保留这些文章。如果有人 link 有一篇描述 OpenGL 中的深度缓冲区和深度纹理的文章,欢迎您在评论中 post 它)
A depth buffer contains per-pixel floating-point data for the z depth of each pixel rendered.
和
当然,这两种方法之间存在一些差异——值得注意的是,深度纹理可以稍后采样,这与深度缓冲区不同。
尽管存在这些差异,但我不明白为什么深度缓冲区的使用应该比深度纹理更快,因此我的问题是:为什么这两种存储相同数据的方法不能同样快(编辑:使用时用于存储用于深度测试的深度数据)。
"depth buffer",我假设你的意思是 "renderbuffer with a depth format"。
深度渲染缓冲区渲染速度可能比深度纹理更快的可能原因包括:
- 深度渲染缓冲区可以存在于着色器无法访问的专用内存中,因为实现知道您无法从着色器访问它。
- 深度渲染缓冲区可能能够具有深度纹理不能具有的特殊格式或布局,因为纹理必须是着色器可访问的。这可能包括 Hi-Z/Hierarchical-Z 等内容。
#1 倾向于出现在基于图块的架构上。如果操作正确,您可以将深度渲染缓冲区完全保留在图块内存中。这意味着,在渲染操作之后,无需将其复制到主存中。相比之下,对于深度纹理,实现无法确定您不需要将其复制出来,因此为了安全起见必须这样做。
请注意,此列表纯属推测。除非您实际分析过它,或者对硬件有一些特定的了解(如 TBR 案例),否则没有理由假设性能存在任何实质性差异。
This tutorial on shadow-mapping in OpenGL 简要提到了使用深度缓冲区和深度纹理之间的区别(编辑:为深度测试或其他目的存储每个像素的深度信息,例如阴影映射)通过声明:
Depth texture. Slower than a depth buffer, but you can sample it later in your shader
然而,这让我想知道为什么会这样。毕竟,两者似乎只不过是一个包含一些数据的二维数组,并且 Microsoft 图形注释上的定义以非常相似的术语定义它们(这些注释在评论中指出,不是在 OpenGL 上而是在另一个图形引擎,但 depth-buffers/-textures 的目的似乎非常相似——我还没有找到对 OpenGL depth-buffers/-textures 两者的相同描述——出于这个原因,我决定保留这些文章。如果有人 link 有一篇描述 OpenGL 中的深度缓冲区和深度纹理的文章,欢迎您在评论中 post 它)
A depth buffer contains per-pixel floating-point data for the z depth of each pixel rendered.
和
当然,这两种方法之间存在一些差异——值得注意的是,深度纹理可以稍后采样,这与深度缓冲区不同。
尽管存在这些差异,但我不明白为什么深度缓冲区的使用应该比深度纹理更快,因此我的问题是:为什么这两种存储相同数据的方法不能同样快(编辑:使用时用于存储用于深度测试的深度数据)。
"depth buffer",我假设你的意思是 "renderbuffer with a depth format"。
深度渲染缓冲区渲染速度可能比深度纹理更快的可能原因包括:
- 深度渲染缓冲区可以存在于着色器无法访问的专用内存中,因为实现知道您无法从着色器访问它。
- 深度渲染缓冲区可能能够具有深度纹理不能具有的特殊格式或布局,因为纹理必须是着色器可访问的。这可能包括 Hi-Z/Hierarchical-Z 等内容。
#1 倾向于出现在基于图块的架构上。如果操作正确,您可以将深度渲染缓冲区完全保留在图块内存中。这意味着,在渲染操作之后,无需将其复制到主存中。相比之下,对于深度纹理,实现无法确定您不需要将其复制出来,因此为了安全起见必须这样做。
请注意,此列表纯属推测。除非您实际分析过它,或者对硬件有一些特定的了解(如 TBR 案例),否则没有理由假设性能存在任何实质性差异。