Рендеринг OpenGL в текстуру в iPhone завершается с ошибкой при включении MSAA

#iphone #opengl-es #textures #msaa

#iPhone #opengl-es #Текстуры #msaa

Вопрос:

Мой код рендеринга в текстуру iPhone работает, только если я отключу MSAA, в противном случае все, что я получаю, — это черная текстура. Что может быть причиной проблемы?

Вот мой код:

 glViewport(0,0, target->_Width, target->_Height);
glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT Or GL_STENCIL_BUFFER_BIT);

glBindTexture(GL_TEXTURE_2D, target->_Handle);          

// render stuff here

glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, target->_Width, target->_Height, 0);
glBindTexture(GL_TEXTURE_2D, 0);
  

Ответ №1:

По-видимому, когда вы используете MSAA для вашего основного фреймбуфера, вы должны использовать его и для любых других FBO, в которые вы хотите выполнить рендеринг. Поскольку GL_TEXTURE_2D_MULTISAMPLE он недоступен в OpenGL ES 2, решение, которое я нашел, заключается в том, чтобы довольно просто применить те же изменения, которые необходимы для перехода от обычного рендеринга к рендерингу MSAA, а также к вашему коду рендеринга в текстуру.

Вам нужны 3 дополнительных буфера: буфер цветопередачи с несколькими выборками, буфер глубинной визуализации с несколькими выборками и новый FBO для их подключения. Перед рендерингом привяжите новый FBO вместо FBO текстуры. После рендеринга преобразуйте новый MSAA FBO в texture FBO так же, как вы делаете в своем основном коде рендеринга с помощью glResolveMultisampleFramebufferAPPLE() .

Обратите внимание, что по какой-то причине рендеринг текстур с включенным MSAA работает без этих изменений в симуляторе. Может быть, он использует GL_TEXTURE_2D_MULTISAMPLE автоматически?

Ответ №2:

Причина вашей проблемы в том, что вы не можете выполнить рендеринг текстуры с несколькими выборками в OpenGL ES. Действительно, если я правильно помню, текстуры с несколькими выборками не существуют в OpenGL ES. Desktop OpenGL позволяет это делать, но для этого он вводит совершенно новую цель текстуры (GL_TEXTURE_2D_MULTISAMPLE).

Буфер, обеспечивающий мультисэмплинг, — это не то же самое, что обычная текстура; вот почему настольный OpenGL использует специальную текстуру target, которая имеет свой собственный тип GLSL sampler.

Комментарии:

1. Он даже не выполняет рендеринг в текстуру (с FBO), а копирует текстуру в старом стиле.

2. Да, я использую glCopyTexImage2D, но весь рендеринг происходит внутри рендеринга в FBO (с несколькими выборками), я думаю, мне нужно переписать логику рендеринга