Как обработать альфу в ручной операции наложения «Наложение»? - PullRequest
4 голосов
/ 14 января 2011

Я играю с некоторой ручной обработкой изображений, и воссоздаю стандартную смесь «наложения». Я смотрю макросы "Photoshop math" здесь:

http://www.nathanm.com/photoshop-blending-math/ ( См. Также здесь для более удобочитаемой версии Overlay)

Оба исходных изображения в достаточно стандартном формате 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??

Ответы [ 3 ]

3 голосов
/ 23 сентября 2013

После смешивания основного цвета и смешанного цвета, смешайте исходный базовый цвет и цвет, полученный в результате смешивания, используя альфа смешанного цвета:

vec4 baseColor = ...;
vec4 blendColor = ...;
vec4 blendedColor = blend(baseColor, blendColor);
vec4 fragmentColor = (1.0 - blendColor.a) * baseColor + blendColor.a * blendedColor;

Я использую это для смешивания "наложения"непрозрачный базовый цвет и смешанная текстура с большим количеством (полупрозрачных) пикселей.

1 голос
/ 14 января 2011

Просто предположение, но я бы попробовал

resultA = 1 - (1-baseAlpha) * (1-blendAlpha)
0 голосов
/ 14 мая 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...