2009-12-05 17 views
12

Estoy tratando de crear un buffer de representación fuera de pantalla en OpenGL ES en el iPhone. He creado el búfer como este:Dibujar para renderbuffer fuera de pantalla en OpenGL ES (iPhone)

 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); 

Pero estoy confundido sobre cómo renderizar el almacenamiento. La documentación de Apple dice que use el método EAGLContext renderBufferStorage: fromDrawable: pero parece que esto solo funciona para un buffer de renderizado (el principal se muestra). Si uso la función normal de OpenGL glRenderBufferStorageOES, parece que no puedo mostrarla. Aquí está el código:

 // 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]; 

Al hacerlo de esta manera, no se muestra nada en la pantalla. Sin embargo, si cambio las referencias a "fuera de pantalla ... Buffer" a los buffers que se crearon con el método renderBufferStorage, funciona bien.

¿Alguna sugerencia?

Respuesta

2

@david buena idea ... lo que tienes que hacer es lo que @prideout dijo ... crear una textura y renderizarla ... y usar la textura en un quad cada vez. Asegúrate de dibujar la textura solo una vez, ya que en tu caso las cosas son persistentes.

- (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 
1

No se puede presentar un renderbuffer normal (creado con glRenderbufferStorage), siempre está fuera de pantalla. presentRenderbuffer: solo se puede usar para renderbuffers creados con el renderbufferStorage:fromDrawable:. Si marcó el valor de retorno de ese presentRenderbuffer:, debe observar que falla.

¿Qué estás tratando de hacer?

+0

Estoy escribiendo un juego en el que estoy dibujando cosas en la pantalla que deberían ser persistentes de fotograma a fotograma. Me gustaría dibujar estas cosas persistentes en un buffer fuera de pantalla, y luego en cada cuadro "blit" esto a la pantalla y dibujar las cosas no persistentes/volátiles encima de él. Realmente me gustaría evitar tener que mantener una lista de los objetos persistentes y volver a crearlos en cada cuadro, ya que la cantidad de objetos podría volverse difícil de manejar muy rápidamente. –

+0

David, ¿resolviste esto? Estoy enfrentando el mismo problema. – vargonian

3

Dado que no puede usar presentRenderbuffer con un FBO fuera de pantalla, debe asociarlo con un objeto de textura usando glFramebufferTexture2DOES, luego renderice un cuadrante texturizado de pantalla completa.

Cuestiones relacionadas