OpenGL ES 2.0和iOS中的默認FrameBuffer


0 Answers

Question

我對FrameBuffers有點困惑。 目前,為了在屏幕上繪製,我使用這個代碼為GL_COLOR_ATTACHMENT0生成一個帶有渲染緩衝區的幀緩衝區。

-(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的評論,他說:

默認的幀緩衝是你默認渲染的地方,你不必做任何事情就可以得到。 Framebuffer對像是你可以渲染的東西,而這被稱為“離屏渲染”。 如果你這樣做了,你的圖像會在紋理中而不是默認的framebuffer(顯示在屏幕上)。 您可以將圖像從該紋理複製到默認的幀緩衝區(屏幕上),這通常是用blitting完成的(但它只在OpenGL ES 3.0中可用)。 但是如果你只想在屏幕上顯示圖像,你可能不會首先使用FBO。

所以我想知道我的方法是否只是用於離屏渲染。 在這種情況下,我需要做什麼來呈現在默認的緩衝區?! (注意,我不想使用GLKView ...)




Related