2009-12-05 11 views
12

Próbuję utworzyć bufor renderowania poza ekranem w OpenGL ES na telefonie iPhone. Został utworzony bufor tak:Rysowanie bufora renderowania poza ekranem w 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); 

Ale jestem zdezorientowany, jak czynią przechowywanie. Dokumentacja Apple mówi, że należy użyć metody EAGLContext renderBufferStorage: fromDrawable:, ale wydaje się, że działa to tylko dla jednego bufora renderowania (główny ekran jest wyświetlany). Jeśli używam normalnej funkcji OpenGL glRenderBufferStorageOES, to nie mogę tego wyświetlić. Oto kod:

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

Robiąc to w ten sposób nic nie jest wyświetlane na ekranie. Jednakże, jeśli przełączę odwołania do "offscreen ... Buffer" na bufory, które zostały utworzone za pomocą metody renderBufferStorage, to działa dobrze.

Wszelkie sugestie?

Odpowiedz

2

@David dobry pomysł .. co musisz zrobić, to co @prideout powiedział .. utworzyć teksturę i renderowania do niego .. i używać tekstury na kwadracie za każdym razem. Pamiętaj, aby narysować teksturę tylko raz, ponieważ w Twoim przypadku rzeczy są trwałe.

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

Nie można przedstawić normalnego bufora renderowania (utworzonego za pomocą glRenderbufferStorage), jest on zawsze poza ekranem. presentRenderbuffer: można używać tylko dla buforów renderowania, które zostały utworzone przy użyciu renderbufferStorage:fromDrawable:. Jeśli sprawdziłeś wartość zwracaną tego presentRenderbuffer:, powinieneś zaobserwować, że zawodzi.

Co próbujesz zrobić?

+0

Piszę grę, w której rysuję rzeczy na ekranie, które powinny być trwałe od ramki do ramki. Chciałbym narysować te trwałe rzeczy do bufora poza ekranem, a następnie na każdej klatce "rozlać" to na ekran i narysować nietrwałe/niestałe rzeczy na wierzchu. Naprawdę chciałbym uniknąć konieczności utrzymywania listy trwałych obiektów i ponownego ich tworzenia w każdej klatce, ponieważ liczba obiektów może być bardzo szybko bardzo nieporęczna. –

+0

David, rozwiązałeś to? Mam do czynienia z tym samym problemem. – vargonian

3

Ponieważ nie można użyć presentRenderbuffer z FBO poza ekranem, należy skojarzyć je z obiektem tekstury przy użyciu glFramebufferTexture2DOES, a następnie wyrenderować teksturowany pełnoekranowy quad.