GLSLでmix-blend-modeを再現実装した比較デモはこちら
// 和
finalColor = background + foreground;
// 差
finalColor = background - foreground;
// 差の絶対値
finalColor = abs(background - foreground);
// 明るい方の色
finalColor = max(background, foreground);
// 暗い方の色
finalColor = min(background, foreground);
// 積
finalColor = background * foreground;
// 反転した状態で乗算し、再度反転して戻す
finalColor = 1.0 - (1.0 - background) * (1.0 - foreground);
// 背景の明度(求め方は色空間によっていろいろ?)
float brightness = max(background.r, max(background.g, background.b));
// 背景の明度が0.5以下かどうかで分岐
finalColor = mix(
// 0.5以下であれば、係数2倍でmultiply
2.0 * background * foreground,
// 0.5より大きければ、係数2倍でscreen
1.0 - 2.0 * (1.0 - background) * (1.0 - foreground),
//
step(0.5, brightness)
);
finalColor = background / (1.0 - foreground);
finalColor = 1.0 - (1.0 - background) / foreground;
TODO: 数式調べて考察する
TODO: 数式調べて考察する