我的OpenGL应用程序需要一个模板和深度缓冲区。深度缓冲区至少需要通过帧缓冲对象渲染到纹理,以便我可以进行延迟着色和其他后处理效果。我已经设置了这个帧缓冲区(使用GL_DEPTH24_STENCIL8),但我有一些问题和疑问。
首先,我想使用32位浮点深度缓冲区。 GL_DEPTH32F_STENCIL8选项似乎最明显。我想知道的是,这种格式的实际内存占用量是多少?逻辑上它将是40位,但知道我对齐的做法,如果他们将它填充到64,我不会感到惊讶,许多消息来源说这正是发生的事情。我想肯定。
也许保持深度和模板缓冲区分离对我来说会更好?我不得不担心这不受支持吗?缓存效率如何,模板和深度测试通常一起执行?
PS。我没有使用多重采样。
答案 0 :(得分:4)
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
格式,因为它会混淆对齐;它们都是RGBX
或4的一些排列,以产生32位像素。
为了给您一个权威的答案,我将向您推荐首先将此格式添加到GL的扩展程序:
概述
[...]
此外,此扩展程序还提供了新的打包深度/模板像素格式(请参阅EXT_packed_depth_stencil),其中 64位像素 由 <组成em> 32位浮点深度值 , 8位模板 , 24个未使用位 即可。还提供了打包深度/模板纹理内部格式。
答案 1 :(得分:0)
关于格式的内存占用问题我没有答案(我想你可以在其他地方找到它)但我建议使用RenderBuffer而不是Framebuffer作为延迟着色的Depth Stencil部分: Whats the concept of and differences between Framebuffer and Renderbuffer in OpenGL?