OpenGL ES 2.0和iOS中的默认帧缓冲区

OpenGL ES 2.0和iOS中的默认帧缓冲区,ios,opengl-es,Ios,Opengl Es,我对帧缓冲区有点困惑。 目前,为了在屏幕上绘制,我使用此代码为GL\u COLOR\u ATTACHMENT0生成了一个带有Renderbuffer的帧缓冲区 -(void)initializeBuffers{ //Build the main FrameBuffer glGenFramebuffers(1, &frameBuffer); glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); //Build t

我对帧缓冲区有点困惑。 目前,为了在屏幕上绘制,我使用此代码为
GL\u COLOR\u 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];
在阅读中,我看到了Arttu Peltonen的评论,他说:

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

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

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

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

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

关于所有这些,还有更多的信息,以及苹果公司网站中每种方法的示例代码