Моя сцена состоит из слоев, которые отображаются в кадровые буферы. Внутри кадровых буферов элементы рисуются спереди назад и смешиваются с ColorWithAlpha
или EraseWithAlpha
. Кадровые буферы смешиваются с соответствующими версиями * WithPremultipliedAlpha. Следующий код контролирует смешивание:
switch (m_blendMode)
{
case BlendMode::ColorWithAlpha:
{
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
break;
}
case BlendMode::ColorWithPremultipliedSrcAlpha:
{
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
break;
}
case BlendMode::EraseWithAlpha:
{
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
break;
}
case BlendMode::EraseWithPremultipliedSrcAlpha:
{
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
break;
}
Я изо всех сил пытаюсь стереть работу через границы буфера кадра. Рисование всех элементов спереди в один кадровый буфер с использованием ColorWithAlpha
является эквивалентом рисования всех элементов, кроме одного, в один кадровый буфер, а затем рисование конечного слоя в отдельном кадровом буфере с использованием ColorWithAlpha
, а затем смешивание отдельного кадрового буфера с оригиналом с использованием ColorWithPremultipliedAlpha
. То же самое не верно для стирания. Я попытался отрисовать слои назад, используя ColorWithAlpha
, а затем EraseWithPremultipliedAlpha
, чтобы смешать целевое FBO с Dest FBO. К сожалению, это не эквивалентно рисованию всех элементов в верхнем FBO непосредственно в dest FBO с помощью EraseWithAlpha
. Можно ли сделать режим стирания наложения ассоциативным, включив ту же настройку, что и в режимах раскраски? Если нет, существует ли режим псевдо-стирания, который является ассоциативным и может быть заменен здесь?