Подтвердить что ты не робот

Нарисуйте в offscreen renderbuffer в OpenGL ES (iPhone)

Я пытаюсь создать внеэкранный буфер визуализации в 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, он отлично работает.

Любые предложения?

4b9b3361

Ответ 1

@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

Ответ 2

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

Ответ 3

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

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