深度+模板帧缓冲关系

Depth + Stencil framebuffer concerns

本文关键字:缓冲 关系 深度      更新时间:2023-10-16

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

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

也许保持深度和模板缓冲区分开对我来说会更好?我需要担心这个不被支持吗?缓存效率如何,因为模板和深度测试经常一起执行?

p。我没有使用multisampling

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:

GL_ARB_depth_buffer_float

概述

[…]

此外,这个扩展提供了新的包装深度/模板像素格式(参见EXT_packed_depth_stencil),它具有64位像素,由32位浮点深度值8位模板24位未使用的位组成。还提供了一个填充深度/模板纹理内部格式。