c++ - Depth + Stencil 帧缓冲区问题

标签 c++ opengl depth-buffer stencil-buffer

我的 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/

相关文章:

opengl-es - 如何在OpenGL(ES)中正确渲染重合多边形

c++ - 从 cv::Mat 获取部分数据

具有变量且参数​​数量未知的 C++ 函数

c++ - CGAL - boost 创建无向图

c++ - 将 C++ OpenGL 项目与另一个 C++ 项目集成

java - LWJGL 3 不会划线

c++ - ISO C++ 禁止声明没有类型的 'uniform_real_distribution'

opengl - OpenGL中的图像和纹理有什么区别

c++ - 为什么我的一些立方体面没有按照我希望的方式呈现?

c++ - OpenGL)阴影贴图使物体看起来偏红