グラデーション生成

CG

塗りつぶし処理 は、ある領域の内部をどの点も同じ色に見えるよう「べた塗り」する処理でした。
ここで扱うグラデーションは、色を緩やかに変化させながら、ある領域の内部や境界を塗る処理です。

グラデーションを生成する処理は、濃淡処理とも呼ばれます。
隣り合う画素の色を少しずつずらしていくことで、色が滑らかに変化しているように見せます。

では、その「少しずつずらした色」を具体的にどう決めればよいのでしょうか。

線形補間によるグラデーション
CG

グラデーションは、両端の色(あるいは明るさ)を決め、その間を埋めるように中間の値を計算することで作られます。このように、2点の値の中間の値を求める操作を補間といいます。

補間にはいくつかの手法がありますが、最も基本的なものが線形補間です。
これは2点の値を一定の割合で混ぜ合わせる補間で、両端をまっすぐ結ぶように値が変化していきます。

2点の値(その画素の色)をABとし、0から1までの割合をtとすると、線形補間された値は次の式で求められます。

この式は、t0から1へ動かしたときに、値がAからBへまっすぐ移っていく様子を表しています。
tが大きくなるほどBの色を多く、Aの色を少なく混ぜ合わせることになります。

  • t = 0のとき、f = Aとなり、始点の値そのもの
  • t = 1のとき、f = Bとなり、終点の値そのもの
  • t = 0.5のとき、fABのちょうど中間の値

線形補間は、AからBという範囲と、割合tから、その割合だけ進んだ位置にある値を求めるものです。tを等間隔に増やしていくと色f(t)も一定の割合で変化していくため、滑らかなグラデーションが得られます。

では、各画素におけるtはどのように求めるのでしょうか。
グラデーションは複数の画素にわたって描かれるので、画素の位置そのものをtに対応させます。グラデーションの始点を0、終点を1とみなし、注目している画素が始点からどれだけ進んだ位置にあるかの比率をtとするのです。

たとえば横幅N画素の帯にグラデーションを描くなら、左からi番目(i0からN-1の値)の画素の割合はi / (N - 1)で求められます。
こうして画素ごとにtを求め、それを式に代入すれば、その画素の色f(t)が一つに定まります。

白から黒へと変化するグレースケールのグラデーション生成を考えます。
輝度を0(黒)から255(白)まで線形に変化させるとすると、始点の輝度をA = 255、終点の輝度をB = 0として、各画素の位置に応じたtからf(t)を計算します。
左端(t = 0)では輝度255の白、右端(t = 1)では輝度0の黒、中央(t = 0.5)ではその中間の灰色になり、白から黒へ均等に移り変わる帯ができます。

色のグラデーションも考え方は同じで、RGBの各成分をそれぞれ線形補間すれば、2色の間をなめらかにつなぐことができます。

補間関数の種類と見た目への影響
CG

線形補間では、値が両端を結ぶ直線に沿って均等に変化していきます。
ここで、補間に使う関数(変化の仕方を決めるカーブ)を変えると、同じ2点の間でもグラデーションの印象は大きく変わります。

たとえば2次関数を使うと、変化の仕方が一定ではなくなります。最初はゆるやかに変化して途中から急に変わる、あるいはその逆に、最初は急で後半はゆるやかになる、といった加速・減速をともなう変化を作ることができます。
対数関数を使うと、はじめに大きく変化して、終点に近づくほど変化がゆるやかになるような、片側に寄ったグラデーションが得られます。

このように、どの関数を選ぶかによって、どこで色が大きく動き、どこでとどまるかが変わります。
均等に移り変わるグラデーションがほしいのか、片側に余韻を残したいのかといった、表現したい印象に応じて補間関数を使い分けるのです。

2次元的なグラデーション
CG

ここまでは、1本の軸にそって値が変化する1次元のグラデーションを考えてきました。この考え方を平面上に広げたものが、2次元的なグラデーションです。

どの方向・どの形で値を変化させるかによって、いくつかのパターンがあり、平面的な広がりを持つグラデーションを作ることができます。

  • 方向(線形):ある一方向にそって値を変化させる
  • 放射(ラジアル):ある中心点からの距離に応じて、外側へ向かって値を変化させる
  • 角度(コニカル):ある中心点のまわりの角度に応じて、回転方向に値を変化させる

これらはいずれも、平面上の各画素の位置から割合tを求め、そのtに補間を適用して値を決めている点では共通しています。違うのは、tをどう定めるか(直線距離か、中心からの距離か、角度か)だけです。

2次元的なグラデーションは、3次元曲面に生じる陰影として捉えると見通しがよくなります。
画素の位置をxy2軸、画素の値(明るさや色)をz軸にとると、グラデーションはxy平面の上に広がる曲面として表せます。
すると、方向グラデーションは斜めに傾いた平面、放射グラデーションはすり鉢状の曲面、というように、グラデーションの形状を曲面の形として理解できます。

ディフュージョンカーブ
CG

ここまでのグラデーションは、直線や同心円、回転方向といった単純な軸に沿って色を変化させるものでした。しかし、絵画のように複雑な輪郭にそって色を滑らかに広げたい場合、こうした単純な軸だけで表現するのは容易ではありません。
そこで考え出されたのがディフュージョンカーブです。

ディフュージョンカーブは、作り手が指定した曲線の両側にそれぞれ色を設定し、その曲線から離れるにつれて、まわりへなめらかに色を拡散させていく手法です。
色を決めるのは曲線とその両側の色だけで、曲線から遠い領域の色は自動的に補われます。

この手法の利点は、少ない指定で複雑な色の広がりを表現できる点にあります。
従来の単純なグラデーションでは、入り組んだ輪郭の形に沿って色を変化させようとすると、多くの制御が必要になりました。
ディフュージョンカーブでは、色を変化させたい境界となる曲線を引き、その両側の色を指定するだけで、輪郭の形に沿った滑らかな色の広がりが得られます。