#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 (с несколькими выборками), я думаю, мне нужно переписать логику рендеринга