みなさん、こんにちは!
今回は、描画モードの話をします。Photoshopなどペイントソフトを使っている方は描画モード自体はよく使っていると思います。
でも意外となんとなくで使っちゃうことが多いんですね。(僕の場合はそう)
なので、実際にどのような計算が行われているのかを考えてみることにしました。全部ではないですが、よく使いそうな機能をピックアップしてまとめていきたいと思います!
大きく分けると3種類に分類して話をしようと思います。
1. 明るくする系の描画モード
→加算、スクリーン、覆い焼きカラー、比較(明)
2. 暗くする系の描画モード
→乗算、焼き込みカラー、焼き込みリニア、比較(暗)
3. コントラスト系の描画モード
→オーバーレイ、ソフトライト、ハードライト、リニアライト、ビビットライト
という感じです。
それぞれの種類に分けて考えると使いやすいと思います。
上のレイヤー(オレンジ色)を下のレイヤー(青色)の上に重ねると、結果色(ピンク色)ができます。この「どうやって色を重ねるか」を設定するのが描画モードです。
以降、下レイヤーになる色を『基本色』、上レイヤーになるのを『合成色』、結果として出来る色を『結果色』と呼びます。
これから描画モード別に解説をしていきます。各モードの説明では、上の画像のように4つの観点(レイヤー構造・明度変化・計算式・シーン適用例)から見ていくと、描画モードの効果が分かりやすいと思います。
─────────────────────────────────────────────────
『加算』
合成色と基本色をRGBごとでそれぞれを足します。255の値が最大です。画像全体が明るくなる効果があります。
『スクリーン』
加算より少し弱いです。リニアカーブになってる感じですね。加算より柔らかい明るさを表現できると思っておくと良いです。(計算式は、255を正規化された値(0~1)に変換しているため、少し複雑な計算になってます。)
『覆い焼きカラー』
明るいところは加算と同じですが、基本色が暗いところはそのまま暗いままになります。暗い部分が残るので、加算よりコントラストが強い印象になりますね。
『比較(明)』
RGBごとに計算して、値の大きい方を使います。足すのではなく、差し替える感じです。
『カラー比較(明)』
比較(明)とは異なり、RGBの合算値を比較して、値の大きい方を使います。使い方が難しい。
─────────────────────────────────────────────────
『乗算』
スクリーンの反対と考えるとわかりやすいです。全体が暗くなります。
『焼き込みカラー』
覆い焼きカラーの反対と考えると分かりやすいです。明るいところがそのまま明るい値として使われます。
『 焼き込みリニア』
加算の反対と考えます。乗算よりもコントラストが少し強く感じます。
『比較(暗)』
比較(明)の反対と考えます。値の小さい方を使用する感じです。
『カラー比較(暗)』
カラー比較(明)の反対と考えます。値の小さい方を使用します。
─────────────────────────────────────────────────
『オーバーレイ』
"基本色を基準"に計算されます。
基本色と合成色を比較して、合成色が128を超える値はスクリーン、下は乗算で合成されます。なので中間値の128では何も効果がない状態です。コントラストが強くなったようになります。下のレイヤー(基本色)を基準に効果を入れています。白と黒の色を活かすときに効果的ですね。
『ソフトライト』
オーバーレイの効果を少し弱めた感じです。オーバーレイより少しコントラストが弱いイメージ。
『ハードライト』
基本的にオーバーレイと近いですが、"合成色を基準"に計算をしているという違いがあります。
上レイヤー(合成色)を基準に乗算やスクリーンを行います。オーバーレイとは逆で、上のレイヤーを基準に効果を決めているので、合成色の影響が大きくなります。
『リニアライト』
ハードライトと同じように"合成色を基準"に計算をします。
合成色の値が大きい方に加算、小さい方に焼き込みリニアの処理を行います。ハードライトよりコントラストが強くなります。
『ビビットライト』
リニアライトと同じで基本色と合成色を比較しています。合成色の値が大きい方に覆い焼きカラー、小さい方に焼き込みカラーを適用します。
こういった描画モードの結果を予測できるようになると、狙った絵作りが出来るようになるので、知識として覚えておくと良いですね。例えば「ここをもっと鮮やかにしたいな」と思ったら覆い焼きカラーを使うとか、「コントラストを強調したい」と思ったらオーバーレイを使うとかね。
Shoostにも描画モードがあるのですが、ここまで多くの描画モードをカバーできていないんですよね。加算や乗算以外の処理を実装しようと思うと処理負荷が高くなったり、複雑な処理を作る必要があったりと、何度かチャレンジしてるんですがどうにも上手くいかないんですよね。。。
でも、何とか実装したいと思って色々と試している最中です。今回の説明したような描画モードが使えるように開発を頑張ります!