OpenGLES 2.0 帧缓冲区可以同时绑定到纹理和渲染缓冲区吗?
Posted
技术标签:
【中文标题】OpenGLES 2.0 帧缓冲区可以同时绑定到纹理和渲染缓冲区吗?【英文标题】:Can an OpenGLES 2.0 framebuffer be bound to a texture and a renderbuffer at the same time? 【发布时间】:2013-08-19 16:36:09 【问题描述】:Brad Larson 提供了一些很棒的代码 here 和 here 用于“将场景渲染到支持纹理的帧缓冲区”,但目前尚不清楚这是否与我用于绘图的其余部分的帧缓冲区相同。
如果将渲染缓冲区附加到帧缓冲区,帧缓冲区是否也可以通过相同的调用渲染到纹理中?
【问题讨论】:
【参考方案1】:听起来您可能对 FBO 的使用有些困惑。如果您需要它,这应该可以帮助您入门:Apple Developer - Drawing offscreen。 This 也有帮助。
渲染缓冲区是您可以绑定到 FBO(帧缓冲区对象)的东西。 FBO 是您在不希望立即显示渲染但想要读取渲染结果或对其执行额外渲染时创建的东西。 FBO 在 OpenGL ES 2.0 中的工作方式,您只有一个可用的颜色连接点(GL_COLOR_ATTACHMENT0 - 您的片段着色器输出变量 gl_FragColor 连接到此连接点),并且它只能连接一个纹理或渲染缓冲区。因此,要回答最后一个问题,您不能拥有一个同时将颜色写入渲染缓冲区和纹理的 FBO。
至于您问题的第一部分,这取决于您是否已经在使用 FBO 或默认帧缓冲区。您正在寻找的行为可能是这样的:
-
绑定一个 FBO
为附加到 FBO 的纹理渲染一些东西
绑定默认帧缓冲
使用第 2 步中的纹理来影响第二个渲染过程中的渲染。
希望这能稍微回答你的问题。
【讨论】:
嗯 - 也许我很困惑。我必须生成并绑定我的帧缓冲区,这就是默认帧缓冲区的意思吗?我无法渲染到纹理,然后在屏幕上渲染纹理? 默认帧缓冲区是您默认渲染到的位置,您无需执行任何操作即可获得它。帧缓冲区 objects 是您可以渲染的对象,某些人将其称为“屏幕外渲染”。如果你这样做,你的图像最终会出现在纹理中,而不是默认的帧缓冲区(显示在屏幕上)。您可以将图像从该纹理复制到默认帧缓冲区(在屏幕上),这通常通过 blitting 完成(但它仅在 OpenGL ES 3.0 中可用)。但如果您只想在屏幕上显示图像,您可能一开始就不会使用 FBO。 谢谢。这非常有帮助。 @ArttuPeltonen 我根据您的最后评论创建了一个问题 (***.com/questions/19662413/…)。请你看一下好吗? 关于绑定默认帧缓冲区的快速说明是,默认帧缓冲区不是 0,而是您在设置 EAGLContext 时创建的缓冲区。为此,您可以在创建名称时保存名称。或者在第 0 步调用它来获取名称(在绑定新的 FBO 之前):(下面的 swift 代码):var defaultFrameBuffer: GLint = 0
glGetIntegerv(GLenum(GL_FRAMEBUFFER_BINDING), &defaultFrameBuffer)
然后在上面提到的第 3 步,绑定回默认帧缓冲区:glBindFramebuffer(GLenum(GL_FRAMEBUFFER), GLuint(defaultFrameBuffer))
。如您所见,defaultFrameBuffer 不是 0。以上是关于OpenGLES 2.0 帧缓冲区可以同时绑定到纹理和渲染缓冲区吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iPhone OpenGL ES 2.0 中在渲染和呈现帧缓冲区之间切换?