我的 OpenGL 应用程序需要模板和深度缓冲区。深度缓冲区至少需要通过帧缓冲区对象渲染到纹理,这样我才能进行延迟着色和其他后期处理效果。我已经设置了这个帧缓冲区(使用 GL_DEPTH24_STENCIL8),但我有一些顾虑和问题。
首先,我想使用 32 位浮点深度缓冲区。 GL_DEPTH32F_STENCIL8 选项似乎是最明显的。我想知道的是,这种格式的实际 内存占用量是多少?从逻辑上讲,它将是 40 位,但知道我在对齐方面做了什么,如果他们将其填充到 64 位,我也不会感到惊讶,许多消息来源说这正是发生的事情。我很想知道。
也许将深度和模板缓冲区分开对我来说会更好?我是否需要担心这不受支持?缓存效率如何,因为模板和深度测试通常一起执行?
附言。我没有使用多重采样。
最佳答案
GL_DEPTH32F_STENCIL8
是 64 位格式;深度为 32 位,模板为 8 位,对齐为 24 位。
有时了解两种桌面图形 API 会派上用场,因为这是添加到 D3D10 的相同格式。 D3D 使其格式的大小更容易通过查看它们的名称来掌握。
在 D3D 中,格式称为 DXGI_FORMAT_D32_FLOAT_S8X24_UINT
:
D32_FLOAT
表示存储32位深度( float )
S8X24_UINT
表示存储8位stencil + 24位未使用(无符号整数)
D3D 的优点在于,当存在用于填充目的的未使用位时,格式会明确声明(这是格式中的 Xn
表示的内容)。 D3D 中没有可渲染颜色的 8 位 RGB
格式,因为这会影响对齐;它们都是 RGBX
或 4 的某种排列以产生 32 位像素。
为了给你一个权威的答案,我将向你推荐首先将这种格式添加到 GL 的扩展:
GL_ARB_depth_buffer_float
Overview
[...]
Additionally, this extension provides new packed depth/stencil pixel formats (see EXT_packed_depth_stencil) that have 64-bit pixels consisting of a 32-bit floating-point depth value, 8 bits of stencil, and 24 unused bits. A packed depth/stencil texture internal format is also provided.
关于c++ - Depth + Stencil 帧缓冲区问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22398575/