前回はノードベースのコンポジットシステムということを主軸にしてNukeでの考え方を紹介した。とくに、その基本である[Merge]について説明した。[Merge]はAfter Effectsにおける「プリコンポーズ」であり、AEがヨコ(時間軸)に強いとするならば、[Merge]を幾重にも重ねていく、ノードベースというシステムは、タテに強い。つまりは複雑な合成に適しているわけだ。さて、今回は実際よく使用する各ノード・オペレータを中心に、より深くNuke的な思考を解説していこう。

すべてはバックグラウンドに

実際にNukeでコンポジットを行おうとした際、After Effectsのユーザーだとまず始めに「あれ? コンポジション設定はどこ?」と、戸惑うのではないだろうか。と言うのは、AEにおける「コンポジション設定」に該当する項目がNukeには存在しないからだ。

AEのコンポジション設定

AEの「コンポジション設定」ウィンドウ。解像度を決めたり、アスペクト比、フレームレート、コンポジットの尺など基本的な設定をここで行う。コンポジションという概念を持たないNukeでは、同様の設定をどこで行うのだろうか?
 

どうやって、コンポジットした仕上がりのサイズを決めるのか......答えは「バックグラウンド」である。

前回も説明したように、ノードベースのコンポジットシステムには「フォアグラウンド」と「バックグラウンド」という概念があり、ビューワーペーンで表示されるコンポジットの結果は、その「バックグラウンド」のサイズが引き継がれる。そして、「プリコンポーズ≒[Merge]」と捕らえると、当然、[Merge]ごとに「バックグラウンド」は宣言され、その[Merge]ごとに「コンポジション設定」されるわけなので、コンポジットのサイズもその都度更新されているという認識が必要となる。実際には、コロコロとサイズの違うものを「バックグラウンド」に設定していくわけではないので、「その都度更新」というのは大げさな表現ではあるのだが、Nukeの設計思想を理解する上では有効だ。

例えば[Merge]のフォア、バックには何も繋がずに、[Viewer]をコネクトしてみる。すると、ビューワーペーンで今のその見ている画像がどういう解像度かという情報が右下に表示される。

Nukeにおける解像度の設定

[Merge]には何もコネクトされていないが、ビューワーペーンの右下には解像度の情報が表示されている。これは、「Project Settings」の値が反映されているため
 

画像では「2k_Super_35(full-ap)」と出ている。これは、デフォルトのプリセットで存在するフォーマットのひとつだ。フォーマットは「Project Settings」で変更できる。

Nukeの「Project Settings」

「Project Settings」はAEの「コンポジション設定」と似たようなことを設定できるのだが、あくまでも基準を設定するだけ。プリセットで色んなフォーマットが準備されており、また下部にある「new」を選べば、ユーザーが新たに任意のフォーマットを定義づけることができる
 

ここで、「ん?」と違和感を感じたAEユーザーは多いと思う。先ほど「AEにおける『コンポジション設定』はないとテラオカは断言しなかった?」と。確かに、この「Project Settings」は「コンポジション設定」に近しいモノとして捕らえることもできる。じゃあ、ココでこの[Merge]に、例えば640×360ピクセルの画像をコネクトしてみよう<A1>。そうすると、Viewerペーンで、今のこの[Merge]が640×360という解像度になったことが確認できる。もし、「Project Settings」=「コンポジション設定」であれば、こんなふうに解像度がコロコロと変わることはない......。

属性の受け渡し例

640×360の画像を、[Merge]にコネクトすると、640×360というサイズの属性が[Merge]に受け渡される。さらに、先の画像をフォア、AEで言うところの平面である[Constant]をバックにしてコネクトしてみると、バックである[Constant]の属性も受け渡される
 

では、「Project Settings」とは何か? それは、その「NukeScript/.nkファイル(AEにおけるプロジェクトファイル/.aep)」の基準である。例えば、コンポジット作業中に、色ベタ(AEにおける平面)がほしくなったとしよう。Nukeでは[Constant]というノード・オペレータを用いる。この新規で[Constant]を呼び出すと、「Project Settings」の設定が引き継がれる。もちろん呼び出した後に、「Project Settings」と指定されているフォーマットとは違うモノに変更することも可能だ。このように「Project Settings」は基礎なのだ。さらには、全てのバックグラウンドに託されているといっても過言ではない。

Nukeの「Project Settings」その2

「Project Settings」で「HD 1920×1080」を選んでいると、それ以降、新規で作成する[Constant]などのサイズはフルHD(1920×1080)が適用される。もちろん、後から任意のフォーマットに変更することも可能。さらに、途中で「Project Settings」でサイズでフォーマットを変更すると、それ以降、新たに作られるものにはそのフォーマットサイズが適用される

[[SplitPage]]

マルチチャンネルを活用する

Nukeの魅力のひとつに、マルチチャンネルのOpenEXRファイルフォーマットが扱えることが挙げられる。これは、「AOVs/Arbitary Output Variables」と言われる方式を用いることにより、ユーザーが任意に定義して1枚の画像に格納できるマルチチャンネルファイルの様式である。NukeはこのOpenEXRの扱いに長けている。筆者が、Nukeを用いる理由も、このファイルを扱えることが大きかったりするのだが、そして、このことがNuke設計思想の根幹にもなっているのだ。

では、実際にこのOpenEXRファイルを扱ってみよう。例えば今回準備したファイルは、デフォルトのRGBAを含め9つのチャンネルを内包している。これらチャンネルを確認するのには、大きく3つの方法がある。1つ目は、ビューワーペーンの左上にある現在の表示チャンネルを指定するプルダウンだ。次に、同じくビューワーペーンの左下にある、現在そのビューワーペーンに表示されているノード・オペレータの所有チャンネルの羅列。さらに、[LayerContactSheet]というノード・オペレータを用いれば、それにコネクトされた全てのチャンネルを画像として一覧で表示することができる。

チャンネルの確認

様々な方法でチャンネルを確認できるが、通常はビューワーペーンの左上にあるプルダウンで各チャンネルを確認しながら作業を行う

ビューワーペーン左下のセッティング表示

また、見落としがちではあるビューワーペーンの左下に出ている情報は非常に有益だ
 

実際に、ビューティ・パスのようなRGBチャンネルに、GI効果を強調するべく、例えばアンビエント・オクルージョン(AO/Ambient Occlusion)を用いてみよう。AEであれば、「EXtractoR」というプラグインを用いて、各チャンネルを"バラす"必要があり、扱うのは常にRGBAチャンネルとなる。

AEプラグイン「EXtractoR」 AEのタイムライン

AEでもプラグインを用いることで、各チャンネルを取り出すことができる。ただし、その場合は常にRGBAとして扱われるが、取り出してしまえば、後は普通にレイヤー合成などが可能だ
 

それに対して、Nukeは"常にマルチチャンネル"ということが根底にある。表示されているチャンネル、例えばRGBAが全てではなく、それは、マルチチャンネルの"流れ"から取り出して来ているに過ぎない。
そう聞くと、万能かつフレキシブルで何やら夢が広がるような感じがしてしまうのだが、常に複数のチャンネル、言い換えれば不必要なチャンネルまでも内包していることになるため、自ずとデータサイズが大きくなってしまい処理に時間がかかることもしばしばだ。

したがい、NukeでOpenEXRファイルを扱う際には現在"流れている"チャンネルを常に把握しておく必要があるわけだ。もちろん、ユーザーが不要だと判断すれば、チャンネルごとに削除することもできる。

さて、具体的にAEで行う要領でAOのチャンネルを乗算する場合は、[Merge]を用いて、[A]、[B]共にOpenEXRをソースとする[Read]をコネクトし、バックグランドであるB チャンネルに「rgba」を指定し、Aチャンネルに「AO」を指定。その上で[operation]の項で乗算合成を行う[multiply]を選択するというのが、Nuke式だ。

ノードとプロパティ

マルチチャンネルなのでソースは同じ画像ではあるので、[Merge]でAチャンネルとBチャンネルに同じ画像をコネクトし、プロパティで[A channels]に「AO」を指定。そして、[operation]で[multiply]を選択する

NukeのUI

AOチャンネルを乗算した例
 

もちろん、AEのように各チャンネルをバラして、合成することも可能だ。チャンネルを任意に相互変換するには[Shuffle]というノード・オペレータを用いる。これは各チャンネルの最大4つの要素をバラバラに再構成させるノード・オペレータだ。後は、[Merge]にてBチャンネルにオリジナルの[Read]をコネクトし、Aチャンネルにこの[Shuffle]をコネクト。さらにこの[Merge]のプロパティでA channelsとB channels共に「rgba」を指定し、先ほどと同じく[operation]にて[multiply]を指定すれば、同様の結果が得られる。

Shuffleのパラメータ

この場合、アンビエント・オクルージョンである「AO」でいったん[Shuffle]で、「rgba」に変換する。こうしておいた方が[Merge]にコネクトしているのは、デフォルトのrgbaではなく、変換後の画像であると把握しやすい

Mergeのパラメータ

なお[Merge]では、チャンネルを特に指定する必要はなく、デフォルトのrgbaのままで問題ない
 

このように、Nukeでは「どのチャンネルをどのように扱うか」がとても重要になる。さらに、どのチャンネルが"表(おもて)"に出てきているかなどが判り辛い。したがい、共同作業を行う際には、[StickyNote]や[Backdrop]をなどを用いて適宜注釈などを加えるといった具合に、理解しやくしておくことをお勧めする。また、[PostageStamp]を用いれば、そのノードの表に出てきている画(rgbaチャンネル)をノードグラフ上で表示することができるので、これも積極的に利用しよう。

ノード構成を判りやすくする補助ツール

Nukeは複数の情報を同時に保持していたり、相互交換していたりするので、データの流れを補助的ツールを用いて伝えた方が判りやすいし、共同作業する上で効率的だ。こうしたツールも標準で準備されている

[[SplitPage]]

具体的なマルチチャンネルの使い方

前項までAEとの比較を中心にNukeを見てきたが、やはりそれではAEの代わりをするためのものになってしまう。AEにはAEの良さがあるし、NukeにはNukeの良さがあるはずだ。つまり、「AEにおける、あのオペレーションはNukeではどうやるの?」では、AEの枠に収まった使用に止まってしまうのではないだろうか?

"Nukeならではの使い方"とは、どういうものなのか? そのひとつはノード・オペレータごとにマスクを適用できるという点が挙げられるだろう。例えば、今回用いた、作例の画像には「RGBMask」という名前のチャンネルがある。これは、ティーポットとキューブ上のオブジェクトを別々に扱うためのマスクだ。そこで、このRGBMaskを用いて、ティーポットだけに[ColorCorrect]の効果を適用してみたい。

AOVsの例

AOVsのようなマルチチャンネルのフォーマットを使えば(事前に設定しておく必要はあるのだが)、マスク等の各要素を個々にレンダリングする必要はないし、ファイルの数を抑えることができるので管理しやすくなる。RGBMaskは実に便利なフォーマットであり、作例のように「 r 」がティーポット、「 g 」がキューブオブジェクトといった具合に1枚の画像で最大3つのマスクが取得可能だ
 

まず、オリジナルの[Read]に[ColorCorrect]をコネクトし、適当に色味を変えてみる。当然ながら、このままでは、画像全体にカラコレが適用されてしまう。そこで、NodeGraph上で[ColorCorrect]ノードをよく見てみると、アイコンの右側に引き出し線らしきものが確認できる。これを引っ張り出すと、「mask」という表示が確認できるはずだ。ココに[ColorCorrect]の効果をマスキングするための画像(作例では、RGBMask)をコネクトしてやればいいのだが、[ColorCorrect]の場合はプロパティでRangesタブに移ると、そのコネクトしたmaskを確認することができる。この場合、ティーポットのマスクはRGBMaskのredチャネルなので、「RGBMask.red」を指定すれば[ColorCorrect]の効果がティーポットに限定される。

[ColorCorrect]を単純に繋げた例

単純に[ColorCorrect]をコネクトするだけでは、画像全体にカラコレが適用されてしまう

maskをソースにコネクト

エフェクトの影響範囲を特定部位に限定させたい場合は、まず[Merge]からmaskのインプットを引っぱり出し、ソースにコネクト

特定オブジェクトにのみ[ColorCorrect]を適用させた例

その上で、マスクとして「RGBMask.red」を指定する
 

このように、各ノード・オペレータにはその効果をマスキングするためインプットが準備されている。AEでも調整レイヤーやプリコンポーズを用いれば似たようなことは可能である。しかし、マルチチャンネルを用いてスマートに処理できるのは、まさにNukeの特長と言えよう。
また、maskのインプットはだいたいノード・オペレータの右側に付いているため、各ノードをNodeGraphで横に伸びるようにコネクトしていくと、maskのインプットを隠してしまうので、タテに繋ぐか、[dot]を用いてインプットを隠さないようにすることをお勧めする。

「dot」なし

横一列に繋いでしまうと、インプットが隠れてしまうため非常に扱いづらい

「dot」あり

Nukeのノードグラフが縦方向に伸びているのはこのためだ。ノード接続が視認しにくい時は「dot」を用いると整理がしやすくなる
 

今回は、コンポジションの仕様を設定する方法と、OpenEXRフォーマットによるマルチチャンネルの扱い方を解説したが、いかがだっただろうか? 読者諸兄の一助になれば幸いだ。
さて、次回のテーマは、先日Nukeユーザー有志たちで「Nuke勉強会」を開催したのだが、スペシャル・ゲストとして講演してくれた元アニマル・ロジックのコンポジット・アーティスト山口幸治氏直伝の「Nukeにおけるコンポジットワークの基礎」を紹介しよう。乞うご期待!

TEXT_テラオカマサヒロ(Galaxy of Terror)

株式会社ギャラクシーオブテラーにてヴィジュアル・エフェクツ・ディレクターとして活躍中。
実写合成からフルCGまで、幅広いVFX制作に携わっている。
tiraoka.blogspot.com