2013-10-29 272 views
4

我對FrameBuffers有點困惑。 目前,爲了在屏幕上繪製,我使用此代碼爲GL_COLOR_ATTACHMENT0生成了一個帶有渲染緩衝區的幀緩衝區。OpenGL ES 2.0和iOS中的默認FrameBuffer

-(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的誰說註釋:

默認幀緩衝區是你默認渲染,你沒有 做任何事情來獲得。 Framebuffer對象是您可以渲染到的東西,而這被稱爲「離屏渲染」。 如果你這樣做,你最終得到的是你的圖像紋理,而不是 默認幀緩衝區(顯示在屏幕上)。您可以將 圖像從該紋理複製到默認幀緩衝區(屏幕上),即 通常使用blitting完成(但它僅在OpenGL ES 3.0中提供)。 但是,如果你只是想在屏幕上顯示圖像,你可能 首先不會使用FBO。

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

回答

10

OpenGL ES規範提供了兩種幀緩衝區:window-system-provided和framebuffer對象。默認幀緩衝區將是窗口系統提供的類型。但該規範並不要求窗口系統提供的幀緩衝區或默認幀緩衝區存在。

在iOS中,沒有窗口系統提供的幀緩衝區,也沒有默認幀緩衝區 - 所有的繪圖都是通過幀緩衝區對象完成的。要渲染到屏幕上,您將創建一個渲染緩衝區,其存儲來自CAEAGLLayer對象(或者您使用代表您創建的渲染緩衝區,就像使用GLKView類時一樣)。這正是你的代碼正在做的。

要進行離線渲染,您需要創建一個渲染緩衝區並調用glRenderbufferStorage爲其分配存儲空間。所述存儲不與CAEAGLLayer相關聯,以便渲染緩衝器不能(直接)出現在屏幕上。 (它也不是紋理 - 設置紋理作爲渲染目標的工作方式不同 - 它只是一個離屏緩衝區。)

有關Apple的OpenGL ES Programming Guide for iOS中的每種方法的所有示例代碼和示例代碼的更多信息。