一个OpenGLES 2.0的帧缓冲对象可以同时绑定纹理和渲染缓冲对象吗?

4
Brad Larson在这里提供了一些很棒的代码(链接)(链接),用于“将场景渲染到支持纹理的帧缓冲区”,但是不清楚这是否与我用于其他绘图的帧缓冲区相同。
如果将一个渲染缓冲附加到一个帧缓冲中,帧缓冲也可以使用同一调用渲染到纹理中吗?
1个回答

3
听起来你对FBO的使用可能有些困惑。如果需要帮助,可以查看这个链接: Apple Developer - Drawing offscreen。这篇文章也许对你有所帮助。

Renderbuffer是可以绑定到FBO(framebuffer object)上的。当不想立即显示渲染结果时,可以创建FBO,以便读取渲染结果或对其进行附加渲染。在OpenGL ES 2.0中,FBO的工作方式是,只有一个颜色附着点可用(GL_COLOR_ATTACHMENT0 - 你的片段着色器输出变量gl_FragColor与此附着点连接),它只能附加一个纹理或渲染缓冲区。因此,回答最后一个问题,你不能同时将颜色写入renderbuffer和texture。

对于你问题的第一部分,这取决于你是否已经使用了FBO或默认的framebuffer。你可能正在寻找以下行为:

  1. 绑定FBO
  2. 将某些内容渲染到附加到FBO的纹理中
  3. 绑定默认的framebuffer
  4. 使用第2步中的纹理在第二次渲染中影响渲染。

希望这个回答能对你有所帮助。


哦,也许我有些困惑。我的意思是生成并绑定帧缓冲,这就是您所指的默认帧缓冲吗?我不能将渲染目标设为纹理,然后在屏幕上渲染纹理吗? - Sam Ballantyne
默认帧缓冲区是您默认渲染的地方,您无需执行任何操作即可获得它。帧缓冲对象是您可以替代渲染的东西,有些人称之为“离屏渲染”。如果您这样做,最终会在纹理中获得图像,而不是默认帧缓冲区(在屏幕上显示)。您可以将该纹理中的图像复制到默认帧缓冲区(屏幕上),通常使用blitting完成(但仅适用于OpenGL ES 3.0)。但是,如果您只想在屏幕上显示图像,则可能首先不会使用FBO。 - Arttu Peltonen
@ArttuPeltonen,我根据您的最后一条评论创建了一个问题(https://dev59.com/QXjZa4cB1Zd3GeqPfIcq),请您能否帮忙看一下? - MatterGoal
3
关于绑定默认帧缓冲区的一些注意事项是,默认帧缓冲区不是0,而是在设置EAGLContext时创建的缓冲区。要获取它,您可以在创建时保存名称,或者调用以下内容以在步骤0(绑定新FBO之前)获取名称(下面是Swift代码):var defaultFrameBuffer: GLint = 0 glGetIntegerv(GLenum(GL_FRAMEBUFFER_BINDING), &defaultFrameBuffer)然后在上述第3步中,将默认帧缓冲区重新绑定:glBindFramebuffer(GLenum(GL_FRAMEBUFFER), GLuint(defaultFrameBuffer))。如您所见, defaultFrameBuffer 不为0。 - Zhao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接