3

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

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

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

PS。我没有使用多重采样。

4

1 回答 1

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格式中的指示)。D3D中没有可渲染颜色的 8 位RGB格式,因为这会混淆对齐;它们是RGBX4 的全部或部分排列,以产生 32 位像素。


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

GL_ARB_depth_buffer_float

概述

[...]

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

于 2014-03-14T15:59:44.483 回答