Как справиться с альфа в ручной операции «наложения»?
-
11-10-2019 - |
Вопрос
Я играю с некоторой ручной обработкой изображений ручной (прогулки по пикселям) и воссоздаю стандартную смесь «наложения». Я смотрю на макросы "Photoshop Math" здесь:
http://www.nathanm.com/photoshop-blending-math/ (Смотрите также здесь Для более читаемой версии наложения)
Оба изображения исходных изображений находятся в довольно стандартном формате RGBA (8 бит каждый), как и пункт назначения. Когда оба изображения полностью непрозрачны (альфа - 1,0), результат смешан правильно, как и ожидалось:
Но если мой слой «смешивания» (верхнее изображение) обладает прозрачностью, я немного покинул Как включить эту альфа в уравнение смешивания правильно. Я ожидаю, что это будет работать так, что прозрачные пиксели в слое смеси не влияют на результат, непрозрачные пиксели в слое смеси делают накладную смеси как нормальные, а пиксели с полузащитным слоем оказывают некоторое масштабированное влияние на результат.
Может ли кто -нибудь объяснить мне уравнения смеси или концепцию, стоящую за этим?
Бонусные очки Если вы можете помочь мне сделать это так, что результирующее изображение было правильно предсказанной альфа (которая вступает в игру только для пикселей, которые не являются непрозрачными в обоих слоях, я думаю).
Спасибо!
// factor in blendLayerA, (1-blendLayerA) somehow?
resultR = ChannelBlend_Overlay(baseLayerR, blendLayerR);
resultG = ChannelBlend_Overlay(baseLayerG, blendLayerG);
resultB = ChannelBlend_Overlay(baseLayerB, blendLayerB);
resultA = 1.0; // also, what should this be??
Решение
Просто предположение, но я бы попробовал
resultA = 1 - (1-baseAlpha) * (1-blendAlpha)
Другие советы
После смешивания базового цвета и цвета смеси смешайте оригинальный базовый цвет и цвет, возникающий в результате смешивания, используя альфа цвета смеси:
vec4 baseColor = ...;
vec4 blendColor = ...;
vec4 blendedColor = blend(baseColor, blendColor);
vec4 fragmentColor = (1.0 - blendColor.a) * baseColor + blendColor.a * blendedColor;
Я использую это для «наложения», смешивая непрозрачный базовый цвет и смесь текстуры, которая имеет много (полу) прозрачных пикселей.
Я точно экспериментировал с этой проблемой, пока не узнал, что лучшее - иметь основание и слой смеси с прямой альфа, а затем преднамеренный только результат с базовой альфа.