Vol.6:主要 3DCG ソフトウェアとの連帯・前編(3ds Max & Maya)
NUKE の特徴であるマルチチャンネルは非常に強力だ。各種 3DCG ソフトウェアのマルチパスレンダリングとも、とても相性が良い。今回から前編と後編の2回に分けて、3DCG ソフトとの連帯について紹介していこう。前編では Autodesk 3ds Max と Autodesk Maya を用いて、簡単に複数のパスを出力する方法を紹介していく。
マルチチャンネルの活用とダイナミックレンジの有効性
最近の主な 3DCG ソフトでは、標準で様々なレンダーパスを出力することができるようになっている。
Mayaの例。ここにあるレンダーパスを全て一度のレンダリングで出力可能だ
以前、「Vol.2:続・AEユーザーのためのNUKE的思考」でも紹介したように、NUKE はそれらのレンダーパスを幅広く活用することができる。と言うのも、デフォルトで親ノード(もしくは B コネクト)から、チャンネルを自動的に引き継ぐようになっているためだ。これは、様々なチャンネルを親ノードに持っておいて、それを必要なときに呼び出して使うという NUKE の考え方によるもの。
例えば、モーションブラーについて見てみよう。NUKE ではポスト処理としてモーションブラー効果を表現することができる。
wipe で、左が VectorBlur ノードの効果あり、右が元ソース。NUKE で VectorBlur ノードを用いるにはモーションベクターが必要となる
3DCG ソフト側でモーションベクターを出力して、それを beauty パス(RGB パス)と一緒に持たせ、NUKE の VectorBlur ノードの[uv channels]でそのモーションベクターを指定してやる。
VectorBlur ノードのプロパティにある [uv channels] でモーションベクターのチャンネルを指定。スクリーンスペースのモーションベクターを使用する。また、u 値 と v 値 の設定により後述してるが 8bit 画像を使用することが可能だ
モーションベクターとは、各ピクセルがそのフレームにおいて、どの向きにどれくらいの速度で動いているかを示すもの。つまり、ピクセル単位ベクターの情報である。NUKE の VectorBlur で扱うモーションベクターは、スクリーンスペースのベクターであり、レンダリング画像である平面にその動きを落とし込んだものである。例えば、あるピクセルがスクリーン座標で右斜め 45 度に向かって動いていたとしたら、そのピクセルの持つモーションベクターは (r, g, b) = (1, 1, 0) のように表すことができる。
例えば、右斜め45度方向に移動しているとすると...
そのモーションベクターチャンネルはこのように (r, g, b) = (1, 1, 0) だったりする(※クリックで拡大)。Viewer ペーンの右下にピックした色が表示される。後述するが、(1, 1, 0) というのはあくまで一例だ
そのモーションベクターに VectorBlur ノードを適用すると、モーションブラー効果を得ることができる
つまり、スクリーン座標の x,y がそれぞれ、r,g で表されているわけだ。このように、スクリーン座標系のモーションベクターだと r と g で座標が表され、通常、b は使用されない。先ほどの例では便宜上 (r, g, b) = (1, 1, 0) としたが、右斜め上 45 度は、その速度によっては (0.1, 0.1, 0) かもしれないし、(10, 10, 0) という場合もある。いずれにせよ、ベクターなので向きと大きさを持っている。
具体的にレンダリングされたモーションベクターチャンネルを見てみると、あるピクセルでは (0.35132, 0.38452, 0) となっていた(画像)。また別のピクセルでは (1.87109, 0.36206, 0)、さらに別のピクセルでは (-6.10938, 1.79688, 0) という具合だった
画像の場合、モーションベクターの red チャンネルが 1(255) を超えている
さらに、こちらの画像の場合は red チャンネルにマイナスの数値(-6.10938)が入っている
以上の結果から、日頃、慣れ親しんでいる 0-1(0-255) の値を超えた数を扱う必要があるわけだ。とは言ったものの、実は "必要がある" というのは言い過ぎで、例えばマイナスの扱いを見てみると、(1, 0, 0) のモーションベクターと (-1, 0, 0) のモーションベクターだと、デフォルト値で VectorBlur を与えると結果は同じになる。
Constant ノードで擬似的にモーションベクターを作成し、それを Shuffle ノードを用いて元の画に新たなチャンネルとして加えてみた(※クリックで拡大)。Constant ノードでは (r, g, b) = (1, 0, 0) としている
先の例の反対のベクターになるように、Constant ノードで (r, g, b) = (-1, 0, 0) としたが、VectorBlur ノードのプロパティの値がデフォルトのままであると、結果は同じだった(※クリックで拡大)
また、xy 座標で (0.5, 0.5) を起点にすれば 0-1 の範囲で全方向を示せるので、詳しい説明は割愛するが VectorBlur のプロパティを調整することで、0-1 の画像......つまり 8bit の画像でも対応は可能だ。
ただし、モーションベクターのスカラーは 1 を超えないように調整する必要があったりと、諸々の問題もあるので、ダイナミックレンジでピクセルの値を持てる方が何かと都合は良い。ポスト処理で被写界深度を表現するために必要なデプスや、beauty を再構築するためによく使うリフレクションパスなども、0-1 に制約されないほうが便利である。なお、筆者のブログ 「TIRAOKAN.」 では、Beauty の再構築についてもう少し説明しているので興味ある方は併せてご覧頂ければと思う。
デプスチャンネルを見てみると、例では黒の部分にもマイナスの値が存在してちゃんと「階調」が存在している。NUKE ではその「階調」を利用して [ZBlur] ノードで被写界深度の効果を追加することが可能だ
長々と説明してきたが、32bit や 16bit のファイルのように、ダイナミックレンジを扱えて、かつ、各種レンダーパスを1つのファイルとして格納できる OpenEXR ファイルフォーマット は NUKE と相性が良く、非常に効果的だ。
今回の作例では OpenEXR を用いて 16bit half float でレンダリングしているが、この場合だと NUKE で [Read] ノードで読み込んだ時点で colorspace がデフォルトで linear になる。.jpg や .tga のような 8bit 画像だとデフォルトで sRGB で読み込まれる


