Рендеринг openGL на текстуру в iPhone не выполняется, когда включен 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);
2 ответа
Очевидно, что когда вы используете MSAA для своего основного кадрового буфера, вы должны использовать его для любых других FBO, которые вы также хотите рендерить. поскольку GL_TEXTURE_2D_MULTISAMPLE
недоступно в OpenGL ES 2, решение, которое я нашел, состоит в том, чтобы просто применить те же самые модификации, которые вам нужны для перехода от обычного рендеринга к рендерингу MSAA, к вашему коду рендеринга в текстуру.
Вам нужно 3 дополнительных буфера: буфер визуализации цвета с несколькими выборками, буфер визуализации глубины с несколькими выборками и новый FBO для их подключения. Привязать новое FBO вместо текстуры FBO перед рендерингом. После рендеринга разрешите новый FBO MSAA в текстурный FBO так же, как в основном коде рендеринга, используя glResolveMultisampleFramebufferAPPLE()
,
Обратите внимание, что по какой-то причине рендеринг текстур с включенным MSAA работает без этих модификаций в симуляторе. Может быть, он использует GL_TEXTURE_2D_MULTISAMPLE
автоматически?
Причина вашей проблемы в том, что вы не можете визуализировать мультисэмплированную текстуру в OpenGL ES. Действительно, если я правильно помню, в OpenGL ES не существует мультисэмплированных текстур. Рабочий стол OpenGL позволяет вам это делать, но для этого он вводит совершенно новую текстурную цель (GL_TEXTURE_2D_MULTISAMPLE).
Буфер, который предлагает мультисэмплинг, не то же самое, что обычная текстура; Вот почему Desktop OpenGL использует специальную текстурную цель, которая имеет свой собственный тип сэмплера GLSL.