3 回答

TA貢獻1844條經驗 獲得超8個贊
這取決于你想要什么,它可以幫助看看不同方法的結果。
如果你想
紅色+黑色=紅色紅色+綠色=黃色紅色+綠色+藍色=白色紅+白=白 黑+白=白
然后添加一個夾子工程(例如min(r1 + r2, 255)
)這更像你提到的燈光模型。
如果你想
紅色+黑色=深紅色紅色+綠色=深黃色紅色+綠色+藍色=深灰色紅+白=粉紅色黑+白=灰
那么你需要對這些值進行平均(例如(r1 + r2) / 2
)這對于減輕/變暗顏色和創建漸變效果更好。

TA貢獻1155條經驗 獲得超0個贊
要使用Alpha通道進行混合,您可以使用以下公式:
r = new Color();
r.A = 1 - (1 - fg.A) * (1 - bg.A);
if (r.A < 1.0e-6) return r; // Fully transparent -- R,G,B not important
r.R = fg.R * fg.A / r.A + bg.R * bg.A * (1 - fg.A) / r.A;
r.G = fg.G * fg.A / r.A + bg.G * bg.A * (1 - fg.A) / r.A;
r.B = fg.B * fg.A / r.A + bg.B * bg.A * (1 - fg.A) / r.A;
fg是油漆的顏色。bg是背景。r是產生的顏色。1.0e-6只是一個非常小的數字,以彌補舍入誤差。
注意:此處使用的所有變量都在[0.0,1.0]范圍內。如果要使用[0,255]范圍內的值,則必須除以255或乘以255。
例如,50%綠色之上的50%紅色:
// background, 50% green
var bg = new Color { R = 0.00, G = 1.00, B = 0.00, A = 0.50 };
// paint, 50% red
var fg = new Color { R = 1.00, G = 0.00, B = 0.00, A = 0.50 };
// The result
var r = new Color();
r.A = 1 - (1 - fg.A) * (1 - bg.A); // 0.75
r.R = fg.R * fg.A / r.A + bg.R * bg.A * (1 - fg.A) / r.A; // 0.67
r.G = fg.G * fg.A / r.A + bg.G * bg.A * (1 - fg.A) / r.A; // 0.33
r.B = fg.B * fg.A / r.A + bg.B * bg.A * (1 - fg.A) / r.A; // 0.00
產生的顏色為:(0.67, 0.33, 0.00, 0.75)或75%棕色(或深橙色)。
你也可以反轉這些公式:
var bg = new Color();
if (1 - fg.A <= 1.0e-6) return null; // No result -- 'fg' is fully opaque
if (r.A - fg.A < -1.0e-6) return null; // No result -- 'fg' can't make the result more transparent
if (r.A - fg.A < 1.0e-6) return bg; // Fully transparent -- R,G,B not important
bg.A = 1 - (1 - r.A) / (1 - fg.A);
bg.R = (r.R * r.A - fg.R * fg.A) / (bg.A * (1 - fg.A));
bg.G = (r.G * r.A - fg.G * fg.A) / (bg.A * (1 - fg.A));
bg.B = (r.B * r.A - fg.B * fg.A) / (bg.A * (1 - fg.A));
要么
var fg = new Color();
if (1 - bg.A <= 1.0e-6) return null; // No result -- 'bg' is fully opaque
if (r.A - bg.A < -1.0e-6) return null; // No result -- 'bg' can't make the result more transparent
if (r.A - bg.A < 1.0e-6) return bg; // Fully transparent -- R,G,B not important
fg.A = 1 - (1 - r.A) / (1 - bg.A);
fg.R = (r.R * r.A - bg.R * bg.A * (1 - fg.A)) / fg.A;
fg.G = (r.G * r.A - bg.G * bg.A * (1 - fg.A)) / fg.A;
fg.B = (r.B * r.A - bg.B * bg.A * (1 - fg.A)) / fg.A;
公式將計算背景或油漆顏色必須產生給定的結果顏色。
如果您的背景不透明,結果也將是不透明的。然后,前景色可以采用具有不同α值的一系列值。對于每個通道(紅色,綠色和藍色),您必須檢查哪個alpha范圍會產生有效值(0 - 1)。
添加回答
舉報