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