Артефакты OpenGLES + кадровый буфер

Использование OpenGLES 1.1 (в настоящее время нет выбора). Целевая ОС — Android.

У меня есть некоторое несоответствие при рендеринге в основной буфер кадра и при рендеринге в текстуру.

При рендеринге на обычный экран все нормально. Когда я визуализирую текстуру, я получаю темную рамку вокруг моей графики везде, где альфа полупрозрачна.

Вот мои вспомогательные функции:

void RenderNormal()
{
    if (!gIsRenderToTexture)
    {
        glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
        glBlendEquationOES(GL_FUNC_ADD_OES);
    }
    else
    {
        glBlendFuncSeparateOES(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
        glBlendEquationSeparateOES(GL_FUNC_ADD_OES,GL_FUNC_ADD_OES);
    }
}

void RenderAdditive()
{
    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
}

void RenderMultiply()
{
    glBlendFunc(GL_ZERO, GL_SRC_COLOR);
}

Итак, некоторые данные:

  • В более новых системах это работает нормально (также в iOS, OSX и Linux).
  • На Kindle Fire я все еще получаю темные ободки.
  • На более старом Android-устройстве с KitKat мои функции сложения/умножения не отключаются (я предполагаю, что из-за жонглирования между glBlendFunc и glBlendFuncSeparate... Я ничего не отключаю, но все, что я пытаюсь сделать, чтобы исправить это, делает это хуже)

Я ищу способ объединить эти три функции, чтобы они могли работать как с рендерингом в текстуру, так и с рендерингом на обычный экран. Вы можете помочь?


person Raptisoft    schedule 12.07.2017    source источник
comment
Да... проблема, похоже, связана с отрисовкой с нулевой альфой (в отличие от 1 альфы обычного фреймбуфера). Я использую цели рендеринга в качестве слоев в игре, над которой работаю. Кроме того, обратите внимание, что на более новых устройствах это работает ... поэтому я подозреваю, что есть некоторая уборка, которая не требуется на более новых устройствах, которую необходимо выполнять на более старых.   -  person Raptisoft    schedule 12.07.2017
comment
Почему бы просто не очистить до альфы 1.0?   -  person solidpixel    schedule 13.07.2017
comment
Потому что я использую его как прозрачный слой... везде, где я не рисую, я хочу быть прозрачным.   -  person Raptisoft    schedule 13.07.2017


Ответы (1)


Хорошо, день работы и исследований, и я наконец понял, что на целевом устройстве OES не поддерживаются. Таким образом, у всех, у кого есть эта проблема ... Kindle Fire и многие старые планшеты просто не поддерживают glBlendFuncSeparateOES или glBlendEquationOES, и они не будут работать ТИХО.

person Raptisoft    schedule 13.07.2017