Pytanie Rysuj na bufecie renderowania poza ekranem w OpenGL ES (iPhone)


Próbuję utworzyć bufor renderowania poza ekranem w OpenGL ES na iPhone. Stworzyłem bufor w następujący sposób:

        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 renderować pamięć masową. 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.

Jakieś sugestie?


12
2017-12-05 21:34


pochodzenie




Odpowiedzi:


@David dobry pomysł .. co musisz zrobić, to co @prideout powiedział .. utworzyć teksturę i renderowania do niego .. i używać tekstury na quad 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

2
2017-12-07 15:02





Ponieważ nie możesz użyć presentRenderbuffer z poza ekranem FBO, powinieneś powiązać go z obiektem tekstury za pomocą glFramebufferTexture2DOES, a następnie wyrenderuj teksturowany pełnoekranowy quad.


3
2017-12-06 18:49





Nie można przedstawić normalnego bufora renderowania (utworzonego za pomocą glRenderbufferStorage), jest on zawsze poza ekranem. presentRenderbuffer: może być użyty tylko dla buforów renderowania, które zostały utworzone za pomocą renderbufferStorage:fromDrawable:. Jeśli zaznaczyłeś wartość zwrotu tego presentRenderbuffer:powinieneś zaobserwować, że to się nie udaje.

Co próbujesz zrobić?


1



Piszę grę, w której rysuję rzeczy na ekranie, które powinny być trwałe od klatki do klatki. 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. - David Ensminger
David, rozwiązałeś to? Mam do czynienia z tym samym problemem. - vargonian