OpenGL 16 位模板缓冲区?

Nic*_*tum 3 c++ opengl

我正在尝试创建具有 4 个颜色附件、一个 16 位深度缓冲区和一个 16 位模板缓冲区的帧缓冲区。我需要 16 位用于模板缓冲区,因为我在其中存储对象 ID 以用于对象拾取,并且我有超过 255 个对象。我创建了两个渲染缓冲区:

glBindRenderbuffer(GL_RENDERBUFFER, mID);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);

glBindRenderbuffer(GL_RENDERBUFFER, mID2);
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX16, width, height);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
Run Code Online (Sandbox Code Playgroud)

我要求 SDL 给我 16 位模板:

SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 16);
Run Code Online (Sandbox Code Playgroud)

但是当我将模板渲染缓冲区绑定到帧缓冲区时,我收到帧缓冲区不完整错误。我知道 wiki 指出规范不需要 GL_STENCIL_INDEX16 。是否不可能创建 16 个模板缓冲区?我可以将对象 ID 整数编码为 8 位值吗?

Rab*_*d76 5

不需要支持单独的深度和模板缓冲区附件。

请参阅OpenGL 4.6 API 核心配置规范 - 9.4.3 所需的帧缓冲区格式

[...]但是,当深度和模板附件都存在时,仅需要实现来支持两个附件引用同一图像的帧缓冲区对象。

也可以看看:

无法将单独的模板缓冲区附加到 FBO(压缩深度+模板即可)

帧缓冲区对象 - 完整性规则

  • @NicovanBentum 似乎只支持 2 种组合深度/模板格式。请参阅[深度模板格式](https://www.khronos.org/opengl/wiki/Image_Format#Depth_stencil_formats): *"[...] 只有 2 种深度/模板格式,每种提供 8 个模板位:`GL_DEPTH24_STENCIL8 ` 和 `GL_DEPTH32F_STENCIL8`"* (3认同)