mix-blend-mode比較考察

GLSLでmix-blend-modeを再現実装した比較デモはこちら

add

// 和
finalColor = background + foreground;

subtract

// 差
finalColor = background - foreground;

difference

// 差の絶対値
finalColor = abs(background - foreground);

lighten

// 明るい方の色
finalColor = max(background, foreground);

darken

// 暗い方の色
finalColor = min(background, foreground);

multiply

// 積
finalColor = background * foreground;

screen

// 反転した状態で乗算し、再度反転して戻す
finalColor = 1.0 - (1.0 - background) * (1.0 - foreground);

overlay

// 背景の明度(求め方は色空間によっていろいろ?)
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)
);

color-dodge(覆い焼き)

finalColor = background / (1.0 - foreground);

color-burn(焼き込み)

finalColor = 1.0 - (1.0 - background) / foreground;

hard-light

TODO: 数式調べて考察する

soft-light

TODO: 数式調べて考察する