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

Posted

技术标签:

【中文标题】是否可以将默认渲染缓冲区附加到 FBO?【英文标题】:Is it possible to attach the default renderbuffer to a FBO? 【发布时间】:2011-01-24 11:57:34 【问题描述】:

我正在考虑重构我的大部分渲染代码,突然想到一个问题: 是否可以使用帧缓冲区对象中的多个颜色附件同时渲染到屏幕和纹理?即使它有许多有用的应用程序,我也找不到任何信息是否应该可行。我想将我的纹理绑定为颜色附件 0 和渲染缓冲区 0 到附件 1 就足够了?

例如,我想制作一个交互式应用程序,您可以在其中“绘制”3D 模型。我通过将 UV 坐标渲染到纹理来解决用户绘制的位置,这样我就可以查看鼠标坐标来修改纹理的位置。在我的情况下,最好有一个着色器,它可以一次性将 UV 绘制到纹理上,并将实际纹理绘制到屏幕上。

有没有更好的方法来做到这一点,还是我走在正确的轨道上?

【问题讨论】:

【参考方案1】:

OpenGL 中没有“默认渲染缓冲区”之类的东西。窗口系统提供了默认的帧缓冲区,保留名称为零,但这基本上意味着“没有启用 FBO”。所以不,不幸的是,普通的 OpenGL 没有提供以某种方式将其颜色缓冲区用作任何其他 FBO 的颜色附件的方法。我不知道有任何扩展可能提供此功能。

对于渲染缓冲区,保留名称也为零,但它只是一个特殊的“无”变量,允许解除绑定渲染缓冲区。

【讨论】:

确实如此。 glspec 的第 4.4 节写道:“最初,GL 使用默认帧缓冲区。附加到此帧缓冲区的图像的存储、尺寸、分配和格式完全由窗口系统管理。因此,默认帧缓冲区的状态,包括它的图像,不能被 GL 更改,也不能被 GL 删除默认帧缓冲区。” 这意味着您甚至无法将自己的渲染缓冲区添加到默认帧缓冲区。要解决您的问题,根据用例,您可以尝试查找“gluUnProject”,它将窗口坐标转换为对象坐标 感谢您的回答。我想我对默认帧缓冲区和不存在的“默认渲染缓冲区”感到困惑。

以上是关于是否可以将默认渲染缓冲区附加到 FBO?的主要内容,如果未能解决你的问题,请参考以下文章

在 GLSL 中检索 FBO 数据

纹理可以绑定到多个 fbo 吗?

渲染到窗口帧缓冲区和 FBO 以保存全尺寸纹理图像

将我的场景渲染到帧缓冲区对象(FBO)然后将该 FBO 渲染到屏幕所需的步骤是啥?

FBO 用于分离纹理

将深度渲染缓冲区复制到深度缓冲区