深度 + 模板帧缓冲区问题

Hay*_*ach 3 c++ opengl stencil-buffer depth-buffer

我的 OpenGL 应用程序需要一个模板和深度缓冲区。深度缓冲区至少需要通过帧缓冲区对象渲染到纹理,这样我才能做延迟着色和其他后处理效果。我已经设置了这个帧缓冲区(使用 GL_DEPTH24_STENCIL8),但我有一些顾虑和问题。

首先,我想使用 32 位浮点深度缓冲区。GL_DEPTH32F_STENCIL8 选项似乎是最明显的。我想知道的是,这种格式的实际内存占用是多少?从逻辑上讲,它将是 40 位,但知道我对对齐做了什么,如果他们将其填充为 64,我不会感到惊讶,而且许多消息来源说这正是发生的情况。我想知道。

也许将深度和模板缓冲区分开对我来说会更好?我是否必须担心这不受支持?缓存效率如何,因为模板和深度测试经常一起执行?

附注。我没有使用多重采样。

And*_*man 5

GL_DEPTH32F_STENCIL8是 64 位格式;深度为 32 位,模板为 8 位,对齐为 24 位。

有时了解这两种桌面图形 API 会派上用场,因为这与添加到 D3D10 的格式相同。D3D 只需查看它们的名称,就可以更容易地掌握其格式的大小。

在 D3D 中,格式被称为DXGI_FORMAT_D32_FLOAT_S8X24_UINT

   D32_FLOAT 表示它存储 32 位深度(浮点)

   S8X24_UINT 表示它存储 8 位模板 + 24 位未使用(无符号整数)

D3D 很好,因为格式明确声明何时有未使用的位用于填充(这是Xn格式中指示的内容)。RGBD3D 中没有可呈现颜色的 8 位格式,因为这会影响对齐;它们是 4 的全部RGBX或某些排列,以产生 32 位像素。


为了给您一个权威的答案,我将向您推荐首先将此格式添加到 GL 的扩展:

GL_ARB_depth_buffer_float

概述

[...]

此外,此扩展提供了新的打包深度/模板像素格式(请参阅EXT_packed_depth_stencil),该格式具有64 位像素,包括32 位浮点深度值8 位模板24 位未使用位。还提供了打包深度/模板纹理内部格式。