在OpenGL ES(iPhone)中绘制到屏幕外渲染缓冲区

在OpenGL ES(iPhone)中绘制到屏幕外渲染缓冲区,iphone,opengl-es,Iphone,Opengl Es,我正在尝试在iPhone上的OpenGL ES中创建一个屏幕外渲染缓冲区。我创建了如下缓冲区: glGenFramebuffersOES(1, &offscreenFramebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, offscreenFramebuffer); glGenRenderbuffersOES(1, &offscreenRenderbuffer); glBindRende

我正在尝试在iPhone上的OpenGL ES中创建一个屏幕外渲染缓冲区。我创建了如下缓冲区:

        glGenFramebuffersOES(1, &offscreenFramebuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, offscreenFramebuffer);

    glGenRenderbuffersOES(1, &offscreenRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, offscreenRenderbuffer);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, offscreenRenderbuffer);
但我不知道如何渲染存储。苹果的文档中说要使用EAGLContext renderBufferStorage:fromDrawable:方法,但这似乎只适用于一个渲染缓冲区(正在显示的主渲染缓冲区)。如果我使用普通的OpenGL函数glRenderBufferStorageOES,那么我似乎无法显示它。代码如下:

        // this is in the initialization section:
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGB8_OES, backingWidth, backingHeight);

    // and this is when I'm trying to draw to it and display it:
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, offscreenFramebuffer);
    GLfloat vc[] = {
        0.0f, 0.0f, 0.0f,
        10.0f, 10.0f, 10.0f,
        0.0f, 0.0f, 0.0f,
        -10.0f, -10.0f, -10.0f,         
    };

    glLoadIdentity();
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, vc);
    glDrawArrays(GL_LINES, 0, 4);
    glDisableClientState(GL_VERTEX_ARRAY);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, offscreenRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
这样做,屏幕上不会显示任何内容。但是,如果我将对“offscreen…Buffer”的引用切换到使用renderBufferStorage方法创建的缓冲区,则效果很好


有什么建议吗?

您不能显示正常的renderbuffer(使用glRenderbufferStorage创建),它始终在屏幕外
presentRenderbuffer:
只能用于使用
renderbufferStorage:fromDrawable:
创建的renderbuffer。如果您检查了该
presentRenderbuffer:
的返回值,您应该会发现它失败了


你想做什么?

既然你不能对屏幕外FBO使用
presentRenderbuffer
,你应该使用
glFramebufferTexture2DOES
将其与纹理对象关联,然后渲染一个带纹理的全屏四元体。

@david好主意。。你需要做的是@prideout说的。。创建纹理并对其进行渲染。。每次都使用四边形上的纹理。确保只绘制一次纹理,因为在您的情况下,对象是持久的

- (void)setUpTextureBuffer 
{
 glGenFramebuffersOES(1, &texturebuffer); 
 glBindFramebufferOES(GL_FRAMEBUFFER_OES, texturebuffer);

 // create the texture
 glGenTextures(1, &canvastexture); 
 glBindTexture(GL_TEXTURE_2D, canvastexture); 
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,  512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
 glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, canvastexture, 0);

 GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES); 
 if(status != GL_FRAMEBUFFER_COMPLETE_OES) { 
  NSLog(@"failed to make complete framebuffer object %x", status);
 }

 glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
 glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

 glClearColor(1.0, 1.0, 1.0, 1.0);
 glViewport(0, 0, 512, 512);
 glClear(GL_COLOR_BUFFER_BIT);
}



//setTargetToTexture() function

 glBindFramebufferOES(GL_FRAMEBUFFER_OES, tbuffer);
 glBindTexture(GL_TEXTURE_2D, allbrushes);
 glViewport(0, 0, 512, 512);

//reset pointers after finishing drawing to textures

 glViewport(0, 0, BWIDTH, BHEIGHT);
 glVertexPointer(2, GL_FLOAT, 0, canvas);   //canvas vertices
 glTexCoordPointer(2, GL_FLOAT, 0, texels);
 glBindTexture(GL_TEXTURE_2D, boundtexture);   //bind to the texture which is the special render target 
 glBindFramebufferOES(GL_FRAMEBUFFER_OES, fbuffer); //back to normal framebuffer

我在写一个游戏,在这个游戏中,我在屏幕上画一些东西,这些东西应该在一帧到另一帧之间保持不变。我想把这些持久性的东西画到一个屏幕外的缓冲区,然后在每一帧上把它“blit”到屏幕上,并在上面画出非持久性/易失性的东西。我真的希望避免维护持久对象的列表,并在每一帧中重新创建它们,因为对象的数量可能会很快变得难以处理。