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

标签 opengl depth-buffer

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.

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

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

请注意,此列表纯粹是推测。除非您实际对其进行了分析,或者对硬件有一些具体的了解(如 TBR 情况),否则没有理由假设性能存在任何实质性差异。

关于opengl - 为什么深度缓冲区比深度纹理更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45320836/

相关文章:

delphi - OpenGL Delphi中的渲染错误

c++ - 作为纹理的深度缓冲区 - "D3D11 ERROR: The Format is invalid when creating a View"

c++ - 如何在 OpenGL 中绘制圆弧

c++ - 我可以从 opengl 的显示屏上调用我的回调函数吗

c++ - 具有交错法线的 VertexBufferObject

c++ - OpenGL,使用浮点颜色渲染到纹理,无需裁剪值

c++ - OpenGL深度测试在某些计算机上不起作用

opengl - 在着色器程序中访问深度模板纹理

java - Libgdx:从多个纹理图集中渲染排序的 Sprite

c++ - 当我单击窗口时 OpenGL 崩溃并且我的动画没有按预期工作