
デジタル合成とは、複数の画像をデジタル的に合成して最終的な画像を作成するプロセスであり、通常は印刷物、映画、または画面表示用として用いられる。これは光学フィルム合成のデジタル版であり、 VFX処理の一部である。
デジタル合成で使用される基本的な操作はアルファブレンディングとして知られており、不透明度値「α」を使用して、最終的に1つの出力ピクセルとなる2つの入力ピクセル値の比率を制御します。
簡単な例として、同じサイズの2つの画像があり、それらを合成する場合を考えてみましょう。入力画像は前景画像と背景画像と呼ばれます。各画像は同じ数のピクセルで構成されています。合成は、2つの入力画像の対応するピクセルからの情報を数学的に組み合わせ、その結果を3つ目の画像(合成画像)に記録することによって行われます。
3つのピクセルを考えてみましょう。
そして
次に、3つのカラーチャネルすべてを考慮し、カラーチャネルがγ=1の色空間で表現されている(つまり、測定値が光強度に比例する)と仮定すると、次のようになります。
γが1と等しくないカラー空間で演算を実行すると、非線形効果が発生し、マットの鋭いエッジに沿ってエイリアシングアーティファクト(または「ジャギー」)として現れる可能性があることに注意してください。より一般的には、アルファチャンネルの影響が非線形であるため、非線形合成では合成されたオブジェクトの周囲に「ハロー」などの効果が発生する可能性があります。合成アーティストは、非線形空間での合成の効果を補正することができます。
アルファブレンディングを画像全体または3Dシーン全体に適用すると、処理負荷の高い処理となります。しかし、この処理をリアルタイムのビデオゲームで行う必要がある場合、パフォーマンスを向上させる簡単な方法があります。
数式を書き換えるだけで、必要な乗算回数を50%削減できる。
半透明のレイヤーを多数合成する必要がある場合、使用する合成演算子の代数的性質を考慮することが重要です。具体的には、結合法則と交換法則によって、繰り返し計算を回避できるかどうかが決まります。
最終画像を生成するためにブレンドするレイヤーが 4 つある場合を考えてみましょう。F=A*(B*(C*D)) ここで、A、B、C、D は部分的に透明な画像レイヤーであり、「*」は合成演算子 (左のレイヤーが右のレイヤーの上に重ねられる) を表します。レイヤー C だけが変更される場合は、F を計算するときにすべてのレイヤーを再ブレンドしないようにする方法を見つける必要があります。特別な考慮をしない限り、4 つのフルイメージブレンドが必要になります。加算ブレンドなどの可換な合成演算子の場合、ブレンド操作の順序を変更しても安全です。この場合、T=A*(B*D) を一度だけ計算し、T*C をブレンドして単一の操作である F を生成するだけで済みます。残念ながら、ほとんどの演算子は可換ではありません。ただし、多くは結合的であるため、操作を F=(A*B)*(C*D) に再グループ化しても安全です。つまり、順序を変更せずに済みます。この場合、S:=A*B を一度計算して、この結果を保存できます。結合演算子を用いてFを形成するには、F:=S*(C*D)を計算することで、新しいレイヤーSを統合するための合成操作を2つ追加するだけで済みます。この式は、1ステップでCをその下のすべてのレイヤーと合成し、2ステップ目でその上のすべてのレイヤーを前の結果とブレンドして最終画像を生成することを示しています。
画像のすべてのレイヤーが定期的に変化するが、多くのレイヤーを合成する必要がある場合(分散レンダリングなど)、事前計算による利点がない場合でも、合成演算子の可換性を利用して並列処理によって計算を高速化できます。ここでも、画像 F=A*(B*(C*D)) を考えてみましょう。この式では、各合成操作が次の操作に依存しているため、逐次計算になります。しかし、結合法則により、F=(A*B)*(C*D) と書き換えることができ、明らかに互いに依存しない 2 つの操作が並列に実行できます。一般に、レイヤー数の対数となる高さを持つ、ペアワイズ合成操作のツリーを構築できます。
歴史的に最も重要な非線形合成システムは、対数色空間で動作するシネオンでした。これは、フィルム乳剤の自然な光応答をより忠実に再現するシステムです(コダック社製のシネオンシステムは現在生産されていません)。時が経つにつれ、その制約ははるかに小さくなり、現在では、ソース画像が対数色空間であっても、ほとんどの合成は線形色空間で行われています。
合成作業には、画像の拡大縮小、レタッチ、色補正などが含まれる場合も多い。
デジタル合成のワークフローには、ノードベース合成とレイヤーベース合成という、根本的に異なる2つの方法がある。
ノードベースの合成では、合成全体を有向非巡回グラフとして表現し、手続きマップでメディアオブジェクトとエフェクトをリンクさせ、ソース入力から最終出力までの進行を直感的にレイアウトします。実際、これはすべての合成アプリケーションが内部的に合成を処理する方法です。このタイプの合成インターフェースは、最終合成を表示しながら「コンテキスト内」で以前の画像処理ステップのパラメーターを変更する機能など、非常に高い柔軟性を提供します。ノードベースの合成パッケージは、レイヤーベースの合成パッケージのようにタイムラインから直接ワークフローが派生しないため、キーフレームやタイムエフェクトの処理が不十分な場合がよくあります。ノードベースのインターフェースを採用しているソフトウェアには、 Natron、Shake、Blender、Blackmagic Fusion、Nukeなどがあります。ノードは、複雑なショットのエフェクトを整理しながら、細かい部分を把握するのに最適な方法です。
レイヤーベースの合成では、合成内の各メディア オブジェクトをタイムライン内の個別のレイヤーとして表現し、各レイヤーには独自の時間境界、エフェクト、キー フレームがあります。すべてのレイヤーは任意の順序で積み重ねられ、通常は最下層のレイヤーが結果画像のベースとしてレンダリングされ、上位の各レイヤーは、以前に合成されたレイヤーの上に順次レンダリングされ、すべてのレイヤーが最終的な合成画像にレンダリングされるまで上に移動します。レイヤーベースの合成は、モーション グラフィックスなどの高速な2Dおよび限定的な3Dエフェクトに非常に適していますが、多数のレイヤーを含むより複雑な合成では扱いにくくなります。この問題に対する部分的な解決策として、一部のプログラムでは、フローチャートと呼ばれる視覚的な図を使用して要素 (画像、エフェクト、その他の属性など) の合成順序を表示し、合成 (「コンプ」) を他の合成に直接ネストすることで、最初の合成でレイヤーを合成し、その結果の画像を前の合成からのレイヤー化された画像と組み合わせるなどして、レンダリング順序を複雑化することができます。