2012-06-01 6 views
1

я работаю со следующей архитектурой:мультитекстурированного рендеринг текстуры

  • OpenGL ES 2 на прошивке
  • Два Eagl контекстов с тем же ShareGroup
  • Два потока (сервер, клиент = основной поток); сервер отображает материал в текстуры, клиент отображает текстуры, используя простые текстурированные квадрациклы.

Дополнительные детали к потоку сервера (рабочий код)

FBO создается во время инициализации:

void init(void) { 
    glGenFramebuffer(1, &fbo); 
} 

визуализации цикл сервера выглядит примерно так:

GLuint loop(void) { 
    glBindFrameBuffer(GL_FRAMEBUFFER, fbo); 
    glViewport(0,0,width,height); 

    GLuint tex; 
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); 

    // Framebuffer completeness check omitted 

    glClear(GL_COLOR_BUFFER_BIT); 

    // actual drawing code omitted 

    // the drawing code bound other textures, so.. 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glGenerateMipmap(GL_TEXTURE_2D); 

    glBindTexture(GL_TEXTURE_2D, GL_NONE); 
    glFlush(); 

    return tex; 
} 

Все это прекрасно работает.

новые (багги) код

Теперь я хочу, чтобы добавить Multisampling к потоку сервера, используя расширение GL_APPLE_framebuffer_multisample и модифицировал код инициализации так:

void init(void) { 
    glGenFramebuffer(1, &resolve_fbo); 
    glGenFramebuffers(1, &sample_fbo); 
    glBindFramebuffer(GL_FRAMEBUFFER, sample_fbo); 
    glGenRenderbuffers(1, &sample_colorRenderbuffer); 
    glBindRenderbuffer(GL_RENDERBUFFER, sample_colorRenderbuffer); 
    glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, width, height); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, sample_colorRenderbuffer); 

    // Framebuffer completeness check (sample_fbo) omitted 

    glBindRenderbuffer(GL_RENDERBUFFER, GL_NONE); 
    glBindFramebuffer(GL_FRAMEBUFFER, GL_NONE); 
} 

Основной цикл имеет было изменено на:

GLuint loop(void) { 
    glBindFrameBuffer(GL_FRAMEBUFFER, sample_fbo); 
    glViewport(0,0,width,height); 

    GLuint tex; 
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); 

    glClear(GL_COLOR_BUFFER_BIT); 

    // actual drawing code omitted 

    glBindFramebuffer(GL_FRAMEBUFFER, resolve_fbo); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); 

    // Framebuffer completeness check (resolve_fbo) omitted 

    // resolve multisampling 
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, resolve_fbo); 
    glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, sample_fbo); 
    glResolveMultisampleFramebufferAPPLE(); 

    // the drawing code bound other textures, so.. 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glGenerateMipmap(GL_TEXTURE_2D); 

    glBindTexture(GL_TEXTURE_2D, GL_NONE); 
    glFlush(); 

    return tex; 
} 

Что я вижу сейчас, так это то, что текстура содержит данные из mul tiple loop(), смешанные вместе. Я предполагаю, что у меня либо отсутствует какой-то «unbind», либо, возможно, звонок glFinish() (у меня ранее была такая проблема в другой точке, я установил данные текстуры с glTexImage2D() и использовал ее сразу после этого - для этого потребовался вызов glFinish() заставить текстуру обновить).

Однако вставив glFinish() после кода рисования ничего здесь не изменилось ..

ответ

1

Oh фигу, такую ​​глупую ошибку. Я пропустил подробности о том, что метод loop() фактически содержит цикл for и отображает несколько текстур, ошибка заключалась в том, что я привязал образец fbo только до этого цикла, поэтому после первого запуска было разрешено решение fbo.

Перемещение привязки fbo внутри цикла устранило проблему.

В любом случае, спасибо @ всем читателям и жаль тратить ваше время :)

Смежные вопросы