GLES2下glFramebufferRenderbuffer的可能用途是什么?

时间:2017-03-31 15:19:55

标签: opengl-es opengl-es-2.0

我正在尝试使用GLES2让我的opengl框架在raspberry pi 3上运行。 在核心档案中,我这样做:

    glGenRenderbuffers ( 1, &ColorBufferGLID );
    glBindRenderbuffer ( GL_RENDERBUFFER, ColorBufferGLID );
    glRenderbufferStorage ( GL_RENDERBUFFER, GL_RGBA, Dimensions.x, Dimensions.y );
    glFramebufferRenderbuffer ( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, ColorBufferGLID );

    glGenRenderbuffers ( 1, &DepthBufferGLID );
    glBindRenderbuffer ( GL_RENDERBUFFER, DepthBufferGLID );
    glRenderbufferStorage ( GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, Dimensions.x, Dimensions.y );
    glFramebufferRenderbuffer ( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, DepthBufferGLID );

    glBindFramebuffer (  GL_READ_FRAMEBUFFER, OpenGLID );
    glBindFramebuffer ( GL_DRAW_FRAMEBUFFER, 0 );
    glBlitFramebuffer ( In_LowerLeft.x, In_LowerLeft.y, In_UpperRight.x, In_UpperRight.y,
                    In_LowerLeft.x, In_LowerLeft.y, In_UpperRight.x, In_UpperRight.y,
                    GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
                    GL_NEAREST );

在GLES2下,我做同样的事情,但是使用不同的枚举,但是后来没有glBlitFramebuffer,所以我无法显示它。 我知道我可以使用glFramebufferTexture2D对纹理而不是渲染缓冲区做同样的事情,但是我必须绘制一个屏幕大小的四边形才能显示它。

如果我不能从渲染缓冲区中进行blit或读取,那有什么意义呢?它怎么用?我还能如何调整这段代码到GLES2?

1 个答案:

答案 0 :(得分:0)

正如OpenGL Wiki上Renderbuffer Objects的文档所述,

  

使用renderbuffer对象的唯一方法是将它附加到a   帧缓冲对象。将FBO绑定到上下文并设置后   适当地绘制或读取缓冲区,您可以使用像素传输   读取和写入操作。

因此,您可以使用像素传输操作来读/写它(例如glReadPixels / glDrawPixels)。如果您不需要直接访问缓冲区,但需要它进行渲染,这也很有用。例如,深度缓冲区,用于渲染屏幕外目标,但从不直接对其进行采样。

关于如何移植代码的问题 - OpenGL ES 3.0中提供了glBlitFramebuffer。如果您必须以OpenGL 2.0为目标,那么您建议绘制屏幕尺寸的四边形是一个合理的解决方案。虽然可能,但我不建议使用glReadPixelsglDrawPixels,因为这需要将所有数据下载到系统内存中,这将非常慢。