【问题标题】:OpenGL ES 2.0 and default FrameBuffer in iOSOpenGL ES 2.0 和 iOS 中的默认 FrameBuffer
【发布时间】:2013-10-29 15:24:33
【问题描述】:

我对 FrameBuffers 有点困惑。 目前,为了在屏幕上绘图,我使用此代码为GL_COLOR_ATTACHMENT0 生成一个带有 Renderbuffer 的帧缓冲区。

-(void)initializeBuffers{

    //Build the main FrameBuffer
    glGenFramebuffers(1, &frameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);

    //Build the color Buffer
    glGenRenderbuffers(1, &colorBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, colorBuffer);

    //setup the color buffer with the EAGLLayer (it automatically defines width and height of the buffer)
    [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:EAGLLayer];
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &bufferWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &bufferHeight);

    //Attach the colorbuffer to the framebuffer
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorBuffer);

    //Check the Framebuffer status
    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);

    NSAssert(status == GL_FRAMEBUFFER_COMPLETE, ERROR_FRAMEBUFFER_FAIL);

}

我使用

显示缓冲区内容
[context presentRenderbuffer:GL_RENDERBUFFER];

阅读this question,我看到Arttu Peltonen的评论说:

默认帧缓冲区是您默认渲染到的位置,您没有 做任何事情来获得它。帧缓冲对象是你可以做的 改为渲染,这被某些人称为“屏幕外渲染”。 如果你这样做,你最终会得到纹理而不是纹理的图像 默认帧缓冲区(显示在屏幕上)。你可以复制 从该纹理到默认帧缓冲区(屏幕上)的图像,即 通常使用 blitting 完成(但它仅在 OpenGL ES 3.0 中可用)。 但如果你只想在屏幕上显示图像,你可能 一开始就不会使用 FBO。

所以我想知道我的方法是否只是用于离屏渲染。 在这种情况下,我必须做什么才能在默认缓冲区上渲染?! (注意,我不想使用 GLKView...)

【问题讨论】:

    标签: ios opengl-es


    【解决方案1】:

    OpenGL ES 规范提供两种帧缓冲区:窗口系统提供的和帧缓冲区对象。默认帧缓冲区将是窗口系统提供的类型。但规范不要求存在窗口系统提供的帧缓冲区或默认帧缓冲区。

    在 iOS 中,没有窗口系统提供的帧缓冲区,也没有默认的帧缓冲区——所有的绘图都是使用帧缓冲区对象完成的。要渲染到屏幕,您创建一个渲染缓冲区,其存储来自CAEAGLLayer 对象(或者您使用代表您创建的对象,如使用GLKView 类时)。这正是您的代码正在做的事情。

    要进行离屏渲染,您需要创建一个渲染缓冲区并调用glRenderbufferStorage 为其分配存储空间。所述存储与CAEAGLLayer 无关,因此渲染缓冲区不能(直接)呈现在屏幕上。 (它也不是纹理——将纹理设置为渲染目标的工作方式不同——它只是一个屏幕外缓冲区。)

    Apple 的OpenGL ES Programming Guide for iOS 中提供了有关所有这些的更多信息以及每种方法的示例代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多