Рисование в экранный рендер-буфер в OpenGL ES (iPhone) - PullRequest
12 голосов
/ 06 декабря 2009

Я пытаюсь создать внеэкранный буфер рендеринга в 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);

Но я запутался в том, как отобразить хранилище. В документации Apple говорится, что нужно использовать 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, он будет работать нормально.

Есть предложения?

Ответы [ 3 ]

3 голосов
/ 07 декабря 2009

Поскольку вы не можете использовать presentRenderbuffer с внеэкранным FBO, вы должны связать его с объектом текстуры, используя glFramebufferTexture2DOES, а затем визуализировать текстурированный полноэкранный квад.

2 голосов
/ 06 января 2010

@ Дэвид хорошая идея ... что вам нужно сделать, это то, что сказал @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
1 голос
/ 06 декабря 2009

Нельзя представить нормальный рендер-буфер (созданный с помощью glRenderbufferStorage), он всегда за кадром. presentRenderbuffer: можно использовать только для буферов рендеринга, созданных с использованием renderbufferStorage:fromDrawable:. Если вы проверили возвращаемое значение этого presentRenderbuffer:, вы должны увидеть, что оно не работает.

Что вы пытаетесь сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...