【问题标题】:Why is depth buffers faster than depth textures?为什么深度缓冲区比深度纹理快?
【发布时间】:2018-01-01 09:57:51
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 请注意,这两篇文章都指的是 XNA,而不是 OpenGL。 XNA 的最后一个版本于 2011 年发布。XNA 的功能与 OpenGL 之间存在显着差异。例如,完全可以使用GL_DEPTH_STENCIL 格式将模板信息存储在纹理中。
  • 我认为,但我可能弄错了,深度渲染缓冲区允许进行一些额外的优化,例如深度纹理无法支持的分层 Z 缓冲区。

标签: opengl depth-buffer


【解决方案1】:

“深度缓冲区”是指“具有深度格式的渲染缓冲区”。

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

  1. 深度渲染缓冲区可以存在于着色器不可访问的专用内存中,因为实现知道您无法从着色器访问它。
  2. 深度渲染缓冲区可能能够具有深度纹理无法具有的特殊格式或布局,因为纹理必须是着色器可访问的。这可能包括 Hi-Z/Hierarchical-Z 等。

#1 倾向于出现在基于图块的架构上。如果你做对了,你可以将你的深度渲染缓冲区完全保留在 tile 内存中。这意味着,在渲染操作之后,无需将其复制到主内存。相比之下,对于深度纹理,实现无法确定您不需要将其复制出来,因此为了安全起见,它必须这样做。

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

【讨论】:

  • 只是对 2 进行了一些改进。HiZ 和 Hierarchical-Z 是一回事。通常,即使使用深度纹理,也可以使用高级 Z 技术。但是在渲染完成并且需要访问深度样本之后,需要解析/解压缩通道,这可能非常昂贵 - 这就是深度纹理较慢的原因。 (但今天可能有 GPU,不需要单独通过,它们可以直接从压缩版本中采样)。
猜你喜欢
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多