随時更新するかも
スクリーン
float screen(float dest, float src) { return 1 - (1 - dest) * (1 - src); } float4 screen(float4 dest, float4 src) { float4 color; color.r = screen(dest.r, src.r); color.g = screen(dest.g, src.g); color.b = screen(dest.b, src.b); color.a = 1.0; return color; }
オーバーレイ
float overlay(float dest, float src) { return dest < 0.5 ? 2.0 * dest * src : 1.0 - 2.0 * (1 - dest) * (1 - src); } float4 overlay(float4 dest, float4 src) { float4 color; color.r = overlay(dest.r, src.r); color.g = overlay(dest.g, src.g); color.b = overlay(dest.b, src.b); color.a = 1.0; return color; }
ソフトライト
float softlight(float dest, float src) { return src < 0.5 ? 2.0 * dest * src + dest * dest * (1.0 - 2.0 * src) : 2.0 * dest * (1 - src) + sqrt(dest) * (2 * src - 1.0); } float4 softlight(float4 dest, float4 src) { float4 color; color.r = softlight(dest.r, src.r); color.g = softlight(dest.g, src.g); color.b = softlight(dest.b, src.b); color.a = 1.0; return color; }
or
float softlight(float dest, float src) { return src < 0.5 ? pow(dest, 2.0 * (1.0- src)) :pow(dest, 1.0 / (2.0 * src)); } float4 softlight(float4 dest, float4 src) { float4 color; color.r = softlight(dest.r, src.r); color.g = softlight(dest.g, src.g); color.b = softlight(dest.b, src.b); color.a = 1.0; return color; }
ハードライト
float hardLight(float dest, float src) { return src < 0.5 ? dest * src * 2.0: 1 - 2 * (1 - dest) * (1 - src); } float4 hardLight(float4 dest, float4 src) { float4 color; color.r = hardLight(dest.r, src.r); color.g = hardLight(dest.g, src.g); color.b = hardLight(dest.b, src.b); color.a = 1.0; return color; }
焼きこみ
float colorBurn(float dest, float src) { return src <= 0 ? 0 : 1 - (1 - dest) / src; } float4 colorBurn(float4 dest, float4 src) { float4 color; color.r = colorBurn(dest.r, src.r); color.g = colorBurn(dest.g, src.g); color.b = colorBurn(dest.b, src.b); color.a = 1; return color; }
覆い焼き
float colorDodge(float dest, float src) { return src >= 1 ? 1 : dest / (1 - src); } float4 colorDodge(float4 dest, float4 src) { float4 color; color.r = colorDodge(dest.r, src.r); color.g = colorDodge(dest.g, src.g); color.b = colorDodge(dest.b, src.b); color.a = 1; return color; }
ビビッドライト
float vividLight(float dest, float src) { return src < 0.5 ? colorBurn(dest, 2 * src) : colorDodge(dest, 2 * (src - 0.5)); } float4 vividLight(float4 dest, float4 src) { float4 color; color.r = vividLight(dest.r, src.r); color.g = vividLight(dest.g, src.g); color.b = vividLight(dest.b, src.b); color.a = 1.0; return color; }
参考
Python3 & OpenCV で画像処理を学ぶ[5] 〜 AfterEffects/Photoshopにある描画モードを実装する - Optie研