色収差再考

キリスト降誕おめでとうございます。

adventar.org

https://atarabi.com/kikaku/plugin/old/#ChromaticAberration

2011年にChromatic AberrationというAEプラグインを公開した。ありがたいことに今もちょくちょくダウンロードされているのだけど、当時の技術的限界もあり、特にパフォーマンス面において難がある。 なので、しばらく前からコンセプトはそのままに一から作り直している。そこで今一度、色収差(風)エフェクトの有り様について考えてみたい*1


色収差風エフェクトは基本的には、色の分解、サンプリング、合成からなる。まずはこれらの処理について大まかに見ていく。

分解

神は「光あれ」と言われた。すると光があった。

色を分解しないことには始まらない。最も単純なのは、R, G, Bの3色に分割することである。そのうち2色を連動させれば、容易に青と黄、マゼンタと緑、赤とシアンの反対色を構成出来る。

サンプリング

神はまた言われた、「水の間におおぞらがあって、水と水とを分けよ」。

分解した色ごとにサンプリング位置を異にすることで色ずれの効果が生じる。倍率色収差ライクにしたいならスケールを変えたり、レンズディストーションさせて、動径方向にずらせばよい。

RowbyteのSeparate RGBはそれから一歩進めて、R, G, Bチャンネルそれぞれに対して、トランスフォーム出来るようにしてある。

https://aescripts.com/separate-rgb/

SapphireのS_TimeWarpRGBは時間軸方向にずらしている。

組み合わせ次第で色々な方向を目指すことが出来る。ただ、実現可能な領域が増えたとしても、"容易に"実現可能な領域が増えるとは限らないので(むしろ減ることもある)、目指したい方向を明確化し、"容易に"実現可能な領域を単調増加させつつ、実現可能な領域も増やしていくのがいいとは思う。

合成

神はまた言われた、「天の下の水は一つ所に集まり、かわいた地が現れよ」。そのようになった。

通常加算で合成するが、後ほど他の可能性もないか検討する。例えば、乗算が絡むものは黒に沈むので難しい。




分解の分解

分解についてもう少し推し進めたい。例えば、単純にR, G, Bに分割するだけだとパキッとしすぎる。

分割数を増やせばスムーズにすることが出来る。

この際、徒に分割したら色調が変わってしまう。なので、元の色調を維持するために、分割した色を足した場合に白になるように調整する必要がある(加算で合成する場合)。

 \displaystyle
(r, g, b) = \sum_{i}(r_{i}, g_{i}, b_{i}) = (1, 1, 1)

最初からそれを考慮するのは面倒なので、とりあえず色を選んでからそれらを足し合わせ、その合計で各色を割れば良い。

 \displaystyle
(r', g', b') = \frac{(r_{i}, g_{i}, b_{i})}{\sum_{i}(r_{i}, g_{i}, b_{i})}

SapphireのS_WarpChromaの場合、White Balanceをチェックすることでその計算を自動でしてくれる。

単純にR, G, Bを分割する場合でも色々な方向性があり得る。

つくね氏によるPixelBenderフィルタ群であるRetinaFiltersに含まれていたChromatic Aberrationや、SapphireのS_WarpChromaでは各色間を補間する形になっている。

一方、Plugin EverythingのQuick Chromatic Aberration 3や、PSOFTのP_ChromaticAberrations(のモードFix Green)では、Gは固定し、R, Bを分割している。

この方式の利点は、効果を強めてもGがブレないため、ディティールが潰れないところだろうか。

ちなみに、P_ChromaticAberrationsは2023年に更新されて、色選択のモードが増えて便利になった。

サンプリングと分解

上のような、サンプリング数を調整できる類のプラグインは、いい感じに分割出来るようにトランスフォームに一定の制約をかけている。

例えば、S_WarpChromaはFromとToとを指定する形にしており、その間を容易に補間出来るようにしてあり、

Quick Chromatic Aberration 3は、Gは固定で、パラメータを弄ると、R, Bがそれぞれ連動して逆方向に変化するようになっており、これまた補間しやすくしてある(位置をずらすパラメータであるPositionが、左上、右下への移動に固定されているのが解せないが)。

一方、Separate RGBのようにR, G, Bそれぞれを自由にトランスフォーム出来るようにしてあると、いい感じに割るのが難しくなる。

これらの違いは当然想定している表現の方向性による。

合成の可能性

加算以外の可能性を考える。色調を保つために重要なのは、分割した色を合成していって白を作れるかである。加算の場合は単純に足していけばいいだけなので簡単である。他に容易なのに比較明がある。比較明だと、分割した色の中に値が1となるようなものが含まれていれば良い。つまり、

 \displaystyle
(r, g, b) = \max_{i}(r_{i}, g_{i}, b_{i}) = (1, 1, 1)

を満たせば良い。

加算の場合、分割数を増やすと、一つ一つの色の重みが必然的に小さくなる。

比較明の場合、そういった縛りはなくなるため、望み通りの色をそのままどぎつく出せる。

表現の方向性

どういった表現を想定して設計するかで、パラメータの設定の仕方、とんがり方は当然異なる。グリッチ表現を想定するのであれば、ちょっとしたパラメータの変化で大きく表情を変えるようなものが望まれるだろう。

自分の場合、周辺にちょっとした味をつける、周辺の解像度を落とすことで視線誘導させる、といった使い方にウェイトを置いている。

例えば、EFX Chromatic Aberrationにおいて、Scalingをlinear, square, cubicと切り替えられるが、

https://aescripts.com/efx-chromatic-aberration/

このように掛かり具合を変えられるようにすることで、周辺部だけに掛かるようにする、見せたい中心部の解像度は保つ、といったことが可能となる。

また、ズレ量に応じて、放射ブラーを掛けられるようにすれば視線誘導の効果が際立つ。

その先に

こうして天と地とその万象が完成した。

今回は色収差系のプラグインを色々取り上げたが、みなさんも同種のプラグインを比較しその差異を比べることで、その背景にある設計思想を想像してみてはいかがだろうか。

*1:色収差の光学な話については、ComperK氏のVFXと色収差 - コンポジゴクという記事に詳しい