我可以避免将模板缓冲区从 FBO 传送到后台缓冲区吗?

Posted

技术标签:

【中文标题】我可以避免将模板缓冲区从 FBO 传送到后台缓冲区吗?【英文标题】:Can I avoid blitting the stencil buffer from an FBO to the back buffer? 【发布时间】:2014-04-27 13:12:32 【问题描述】:

我正在使用带有颜色、深度和模板的 FBO 来实现延迟着色。

这是我正在做的事情:

    我创建了一个附加了颜色、深度和模板的 FBO,然后对其进行渲染 我将模板 blit 到后台缓冲区的模板缓冲区 我渲染了最后一遍(使用模板测试)

有什么办法可以避免第 2 步吗?

也就是说,我可以直接在第 3 步中“重复使用”第 1 步中的相同模板吗?我尝试创建一个仅附加一个模板的第二个 FBO,但这不起作用——我假设 b/c 附加一个 FBO 会禁用所有对颜色后台缓冲区的写入。

【问题讨论】:

【参考方案1】:

不幸的是,GL API 实现 FBO 的方式强制执行此 exrta blit 步骤,尽管大多数现实世界的硬件可能没有它。恕我直言,如果他们不会为默认缓冲区制作这个特殊的 FBO 0,而只是为默认颜色、深度和模板缓冲区制作特殊的渲染缓冲区,这样就可以在 FBO 中混合它们(我认为 D3D 允许这样做,但我不确定)。但目前,我不知道有任何 GL 功能/扩展允许这样的事情。

【讨论】:

或许可以在 ios 上使用快捷方式。不是因为 OpenGL 功能,而是因为框架设置渲染的方式。如果您使用GLKView,则渲染始终是框架为您创建的 FBO。通过该设置,可以创建没有模板的视图,然后将模板缓冲区附加到“默认 FBO”。文档说“永远不要尝试 [..] 修改 [..] 帧缓冲区对象”,因此绝对不建议这样做。 使用自定义 FBO。使用现代 OpenGL,您也可以完全不使用 FBO 进行渲染。 @MichaelIV 您的意思是在没有正常后台缓冲区的情况下进行渲染吗?我找不到这样做的方法。

以上是关于我可以避免将模板缓冲区从 FBO 传送到后台缓冲区吗?的主要内容,如果未能解决你的问题,请参考以下文章

带有模板缓冲区 FBO 的延迟渲染器

为啥在使用 FBO 进行多重采样时,OpenGL 会使我的场景变亮?

是否可以将默认渲染缓冲区附加到 FBO?

OpenGL FBO 与 MRT 写入后台缓冲区

FBO 深度和模板渲染缓冲区附件

将opengl主帧缓冲区复制到fbo