У меня было много проблем, пытаясь заставить функцию смешивания OpenGL работать так, как я ожидал, с тем, что я ожидал (или с любой разумной программой для редактирования изображений). В качестве примера, я буду использовать эти два изображения для смешивания (немного сложно увидеть на белом фоне, поэтому цвета помечены):
Изображения для смешивания
Это то, что я ожидаю (и что происходит в paint.net):
ожидаемый результат
Очевидно, что функция смешивания opengl по умолчанию выглядит так (очень неправильно):
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
После тонны тестирования это самое близкое к созданию «хорошей» функции наложения:
glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
Оглядываясь назад на исходный ожидаемый результат, вы заметите, что некоторые цвета немного тусклее, чем должны быть (средняя левая часть). В частности, они предварительно умножаются на половину значения цвета (из-за альфа-версии .5), и я не могу создать функцию, которая этого не делает (не вызывая странных проблем с смешиванием с едва видимой красной прозрачной частью).
Кто-нибудь знает решение этой проблемы? Я использовал предварительно умноженную альфу в исходных кодах (хотя я не хочу этого делать, потому что это требует дополнительной работы, чтобы преобразовать каждый цвет, который я использую в моей игре, в предварительное умножение или просто написать некоторые вещи в каждом шейдере) и сделать это так. :
glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (без предварительного умножения)
Очевидно, это тоже неправильно, но на самом деле это единственный правильный результат, который я получил до сих пор:
glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (предварительно умноженные входы)
Единственная проблема в том, как мне избавиться от предварительного умножения, чтобы отобразить его на экране? Вероятно, потребуется дополнительный цикл рендеринга для каждой вещи, которую я смешиваю, и это кажется слишком сложным для этой проблемы, поэтому я все еще ищу ответ (интересно, что я ничего не могу найти по этому вопросу, потому что OpenGL настолько широко используется, что Я представляю, кто-то другой столкнулся с этой проблемой).
Источники:
Онлайн-тестирование функции смешивания - http://www.andersriggelsen.dk/glblendfunc.php
Изображение нижнего слоя - http://i.stack.imgur.com/XjLNW.png
Изображение верхнего слоя - http: //i.stack.imgur .com / 9CN6w.png