PS中圖層混合模式的Blend公式
自己的總結:(虛擬碼+註釋)
// 混合模式的代入式:
// 顏色的資料型別可以使用float4,有些shader language中,使用COLOR之類的巨集定義,其實也就是float4,裡頭分另有(RGBA/XYZW)的分量組合在一起,
// 與單個標量的運算時:未指定分量運算時,那麼預設將是每個分量與標量逐個運算
// 如:color:float4, brightness = 2;
// color.rgb = color.rgb * brightness =>
// color.r *= brightness;
// color.g *= brightness;
// color.b *= brightness;
// 如果不寫指定分量去處
// color = color* brightness =>
// color.r *= brightness;
// color.g *= brightness;
// color.b *= brightness;
// color.a *= brightness; // 這裡頭就會再多一次:alpha的運算,明顯,如果只是要調節brightness的話,alpha的運算是沒有必要的,所以這裡看個人的使用情況了
float4(RGBA/XYZW)
// 舊的已繪製出來的圖層顏色
// 也叫:DESTINATION COLOR(個人覺得:OLD COLOR BUFFER可讀性會好N多,想不明白這命名怎麼回事)
var oldBuffer:float4;
// 新繪製出來的圖層顏色
// 也叫:SOURCE COLOR(個人覺得:NEW COLOR BUFFER可讀性會好N多,想不明白這命名怎麼回事)
var newBuffer:float4;
// FACTOR:因子(列舉)
// macros
ONE = 1;
ZERO = 0;
ONE_MINUS_DESTINATION_ALPHA = 1 - oldBuffer.a;
ONE_MINUS_DESTINATION_COLOR = 1 - oldBuffer.rgb;
ONE_MINUS_SOURCE_ALPHA = 1 - newBuffer.a;
ONE_MINUS_SOURCE_COLOR = 1 - newBuffer.rgb;
DESTINATION_ALPHA = oldBuffer.a;
DESTINATION_ALPHA = oldBuffer.rgb;
// oldBuffer使用的因子
factor1 = ONE_MINUS_SOURCE_ALPHA;
// newBuffer使用的因子
factor2 = ONE;
// factor1 == ONE_MINUS_SOURCE_ALPHA
// factor2 == ONE;
// 意味著:factor2中的顏色的alpha越大,factor1就越小,就可以實現PhotoShop“正常”的圖層混合效果
blendResult = oldBuffer * factor1 + newBuffer * factor2;
如果說專案中以上的因子列舉不足於實現想要的效果,那麼就得自己寫shader處理新的混合顏色處理了,如下面即將說到的:PhotoShop中的圖層混合效果中使用到的公式,簡單的BlendMode已不能滿足了,那就自己寫shader實現吧
以下的參考資料來源於
先來張一目瞭然的圖(參考別人的)
好了,再來個轉載的長篇大論說明(參考別人的)
註釋:
1.混合模式的數學計算公式,另外還介紹了不透明度。
2.這些公式僅適用於RGB影象,對於Lab顏色影象而言,這些公式將不再適用。
3.在公式中
A 代表下面圖層的顏色值;
B 代表上面圖層的顏色值;
C 代表混合圖層的顏色值;
d 表示該層的透明度。
rgb表示光色三原色;
HSB表示色相、飽和度、亮度;
反相表示255減去顏色值。
混合色表示上層圖層的顏色值;
基色表示下層圖層的顏色值。
【混合時是對每通道進行顏色值的計算,然後再將三個通道混合顯示最終效果。為便於理解,可以開啟 視窗–資訊 面板,在RGB模式下使用黑、白和中性灰圖層進行驗證,將灰色任一通道的顏色值套入公式計算即可。】
1.Opacity 不透明度
C=d×A+(1-d)×B
相對於不透明度而言,其反義就是透明度。
這兩個術語之間的關係就類似於正負之間的關係:100%的不透明度就是0%的透明度。
該混合模式相對來說比較簡單,在該混合模式下,
如果兩個圖層的疊放順序不一樣,其結果也是不一樣的(當然50%透明除外)。
該公式也應用於層蒙板,在這種情況下,d代表了蒙板圖層中給定位置圖層的亮度(d=顏色值/255),
下同,不再敘述。
2.Darken 變暗
B<=A 則 C=B
B>=A 則 C=A
該模式通過比較上下層畫素後取相對較暗的畫素作為輸出,
注意,每個不同的顏色通道的畫素都是獨立的進行比較,色彩值相對較小的作為輸出結果。
下層表示疊放次序位於下面的那個圖層,
上層表示疊放次序位於上面的那個圖層,下同,不再敘述。
3.Lighten 變亮
B<=A 則 C=A
B>=A 則 C=B
該模式和前面的模式是相似,不同的是取色彩值較大的(也就是較亮的)作為輸出結果。
【這兩個也沒啥說的,最簡單的比大小,小學知識~】
4.Multiply 正片疊底
C=(A×B)/255
該效果將兩層畫素的標準色彩值(基於0..1之間)相乘後輸出
其效果可以形容成:兩個幻燈片疊加在一起然後放映,
透射光需要分別通過這兩個幻燈片,從而被削弱了兩次。
【從公式可以看出,C會比A和B都要暗,多個同色圖層連續正片疊底會越來越暗。任何顏色和黑色正片疊底還是黑色,黑色之外其他顏色和白色正片疊底顏色不變。】
5.Screen 濾色
C=255-(A反相×B反相)/255
【 =A+B-(A×B)/255 】
該模式和上一個模式剛好相反,
上下層畫素的標準色彩值反相後相乘後輸出,
輸出結果比兩者的畫素值都將要亮
(就好像兩臺投影機分別對其中一個圖層進行投影后,然後投射到同一個螢幕上)。
從右邊公式中我們可以看出,如果兩個圖層反相後,採用Multiply模式混合,
則將和對這兩個圖層採用Screen模式混合後反相的結果完全一樣。
6.Color Burn 顏色加深
C=A-(A反相×B反相)/B
如果上層越暗,則下層獲取的光越少,加深效果越明顯。
【如果上層為全黑色,則下層顏色值不是255的畫素全變成0】,
如果上層為全白色,則根本不會影響下層。
結果最亮的地方不會高於下層的畫素值。
7.Color Dodge 顏色減淡
C=A+(A×B)/B反相
該模式和上一個模式剛好相反。
該模式下,上層的亮度決定了下層的暴露程度。
如果上層越亮,下層獲取的光越多,也就是越亮。
如果上層是純黑色,也就是沒有亮度,則根本不會影響下層,
【如果上層是純白色,則下層顏色值不是0的畫素全變成255】。
結果最黑的地方不會低於下層的畫素值。
8.Linear Burn 線性加深
C=A+B-255
如果上下層的畫素值之和小於255,輸出結果將會是純黑色。
如果將上層反相,結果將是純粹的數學減。
9.Linear Dodge 線性減淡
C=A+B
將上下層的色彩值相加。結果將更亮。
10.Overlay疊加
A<=128則 C=(A×B)/255
A>128則 C=255-(A反相×B反相)/128
依據下層色彩值的不同,該模式可能是Multiply(正片疊底),也可能是Screen (濾色)模式。
上層決定了下層中間色調偏移的強度。
如果上層為50%灰,則結果將完全為下層畫素的值。
如果上層比50%灰暗,則下層的中間色調的將向暗地方偏移,
如果上層比50%灰亮,則下層的中間色調的將向亮地方偏移。
對於上層比50%灰暗,下層中間色調以下的色帶變窄(原來為0~2×0.4×0.5,現在為0~2×0.3×0.5),
中間色調以上的色帶變寬(原來為2×0.4×0.5~1,現在為2×0.3×0.5~1)。
反之亦然。
11.Hard Light 強光
B<=128則 C=(A×B)/128
B>128則 C=255-(A反相×B反相)/128
該模式完全相對應於Overlay(疊加)模式下,兩個圖層進行次序交換的情況。
如過上層的顏色高於50%灰,則下層越亮,反之越暗。
【如果將上層圖層設為疊加,下層設為強光,則改變圖層順序不影響結果。】
12.Soft Light柔光
B<=128則 C=(A×B)/128+(A/255)^2×(255-2B)
B>128則 C=(A×B反相)/128+sqrt(A/255)×(2B-255)
使顏色變暗或變亮,具體取決於混合色。
此效果與發散的聚光燈照在影象上相似。如果混合色(光源)比50% 灰色亮,則影象變亮,就像被減淡了一樣。如果混合色(光源)比 50%灰色暗,則影象變暗,就像被加深了一樣。使用純黑色或純白色上色,可以產生明顯變暗或變亮的區域,但不能生成純黑色或純白色。
該模式類似上層以Gamma值範圍為2.0到0.5的方式來調製下層的色彩值。
結果將是一個非常柔和的組合。
13.Vivid Light 亮光
B<=128則 C=A-A反相×(255-2B)/(2B)
B>128則 C=A+A×(2B-255)/(2×B反相)
該模式非常強烈的增加了對比度,特別是在高亮和陰暗處。
可以認為是陰暗處應用ColorBurn(顏色加深)和高亮處應用Color Dodge(顏色減淡)。
如果混合色(光源)比 50%灰色亮,則通過減小對比度使影象變亮。如果混合色比 50% 灰色暗,則通過增加對比度使影象變暗。
14.Linear Light 線性光
C=A+2×B-255
通過減小或增加亮度來加深或減淡顏色,具體取決於混合色。
如果混合色(光源)比 50%灰色亮,則通過增加亮度使影象變亮。如果混合色比 50% 灰色暗,則通過減小亮度使影象變暗。
其類似於LinearBurn(線性加深),只不過是加深了上層的影響力。
【由於將上層顏色值加倍,所以結果比線性加深亮很多。】
15.Pin Light 點光
B<=128 則 C=Min(A,2B)
B>128 則C=Min(A,2B-255)
根據混合色替換顏色。如果混合色(光源)比50% 灰色亮,則替換比混合色暗的畫素,而不改變比混合色亮的畫素。如果混合色比 50%灰色暗,則替換比混合色亮的畫素,而比混合色暗的畫素保持不變。這對於向影象新增特殊效果非常有用。
該模式結果就是導致中間調幾乎是不變的,
但是兩邊是Darken(變暗)和Lighten(變亮)模式的組合。
16.Hard Mix 實色混合
A+B>=255 則 C=255
A+B<255 則 C=0
該模式導致了最終結果僅包含6種基本顏色,每個通道要麼就是0,要麼就是255。
17.Difference 差值
C=|A-B|
上下層色彩值之差的絕對值。
該模式主要用於比較兩個不同版本的圖片。
如果兩者完全一樣,則結果為全黑。
與白色混合將反轉基色值;與黑色混合則不產生變化。
18.Exclusion 排除
C=A+B-(A×B)/128
亮的圖片區域將導致另一層的反相,很暗的區域則將導致另一層完全沒有改變。
與“ 差值”模式相似但對比度更低的效果(偏灰)。
19.Hue 色相
HCSCBC =HBSABA
輸出影象的色調為上層,飽和度和亮度保持為下層。
對於灰色上層,結果為去色的下層。
20.Saturation 飽和度
HCSCBC =HASBBA
輸出影象的飽和度為上層,色調和亮度保持為下層。
21.Color 顏色
HCSCBC =HBSBBA
輸出影象的亮度為下層,色調和飽和度保持為上層。
22.Luminosity 明度
HCSCBC =HASABB
輸出影象的亮度為上層,色調和飽和度保持為下層。
23.Dissolve 溶解
該模式根本不是真正的溶解,因此並不是適合Dissolve(溶解)這個稱謂,其表現僅僅和Normal(正常)類似。
其從上層中隨機抽取一些畫素作為透明,使其可以看到下層,
隨著上層透明度越低,可看到的下層區域越多。
如果上層完全不透明,則效果和Normal(正常)不會有任何不同。
【補充】:
24.深色
rB+gB+bB<=rA+gA+bA 則 C=B
rB+gB+bB>=rA+gA+bA 則 C=A
比較混合色和基色的所有通道值的總和並顯示值較小的顏色。不會生成第三種顏色。
25.淺色
rB+gB+bB<=rA+gA+bA 則 C=A
rB+gB+bB>=rA+gA+bA 則 C=B
比較混合色和基色的所有通道值的總和並顯示值較大的顏色。不會生成第三種顏色。
26.減去
C=A-B
檢視各通道的顏色資訊,並從基色中減去混合色。如果出現負數就剪下為零。與基色相同的顏色混合得到黑色;白色與基色混合得到黑色;黑色與基色混合得到基色。
27.劃分
C=(A/B)×255
檢視每個通道的顏色資訊,並用基色分割混合色。基色數值大於或等於混合色數值,混合出的顏色為白色。基色數值小於混合色,結果色比基色更暗。因此結果色對比非常強。白色與基色混合得到基色,黑色與基色混合得到白色。