2011-01-14 5 views
3

Я играю с некоторой обработкой изображений (walk-the-pix), и я воссоздаю стандартную смесь «overlay». Я смотрю на «Photoshop математике» макросах здесь:Как обрабатывать альфа в ручном режиме наложения «Overlay»?

http://www.nathanm.com/photoshop-blending-math/ (See also here более читаемую версию Overlay)

Оба исходных изображений находятся в довольно стандартной RGBA (8 бит) формат, как это место назначения. Если оба изображения полностью непрозрачны (альфа 1,0), результат будет смешаться правильно, как и ожидалось:

Но если мой слой «blend» (верхнее изображение) имеет прозрачность в нем, я немного расплывчато относительно как правильно преобразовать альфа в уравнение смешивания. Я ожидаю, что он будет работать таким образом, чтобы прозрачные пиксели в слое смешивания не влияли на результат, непрозрачные пиксели в слое смешивания накладывали смесь как обычно, а полупрозрачные пиксели слоя смешивания оказывают некоторое влияние на результат.

Может ли кто-нибудь объяснить мне уравнения смешения или концепцию за этим?

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

Спасибо!

// 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?? 

ответ

0

Только предположение, но я хотел бы попробовать

resultA = 1 - (1-baseAlpha) * (1-blendAlpha) 
+0

ОК, в чем причина этого? Благодарю. –

+0

@quixoto Ну, я хочу размножить два, чтобы они оба были в уравнении, не достигнув слишком непрозрачности слишком рано при объединении прозрачных слоев (что произойдет при их добавлении). Но просто умножение поставит его около нуля, один из которых близок к нулю. Таким образом, я инвертирую все это, и он «чувствует себя хорошо» для тестовых значений (например, 0, 0,5, 1) – Timbo

0

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

2

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

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

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