【问题标题】:Writing to renderbuffer AND display with OpenGL with single rendercall使用 OpenGL 写入渲染缓冲区并通过单个渲染调用显示
【发布时间】:2020-02-11 21:57:33
【问题描述】:

有没有一种方法可以同时渲染渲染缓冲区和显示器,而不必多次调用绘图函数?我想要这样的东西:

glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE2D, tbo, 0);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
GLenum* attachments[2] = {GL_COLOR_ATTACHMENT0, ...} //with the second I want to render to screen which would have the same value like the first
glDrawBuffer(2, attachments);

glDrawElements(GL_TRIANGLES, 12*3, GL_UNSIGNED_INT, 0);

所以我可以将我在同一时间绘制的内容用作另一个渲染调用的纹理。我可以写

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDrawElements(GL_TRIANGLES, 12*3, GL_UNSIGNED_INT, 0);

但这需要再次绘制场景,这会很慢。另一种解决方案是仅绘制帧缓冲区,但我认为会有更聪明的解决方案。

【问题讨论】:

  • 简短回答:不。但是,使用glBlitFramebuffer 从一个帧缓冲区复制到另一个。当然要复制数据,但不需要重新渲染场景。

标签: c++ c opengl


【解决方案1】:

您可以使用glBlitFramebuffer() 将帧缓冲区复制到另一个帧缓冲区。

类似:

glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(
    0, 0, fboWidth, fboHeight,
    0, 0, screenWidth, screenHeight,
    GL_COLOR_BUFFER_BIT, GL_NEAREST);

应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多