今回はCGコンプの基本的なところを紹介しようと思う。実写合成でのCGインテグレーションというよりは、もっとライティングコンプに近いところになるが、3DCG素材をどうやってコンプでより良くするかというところにフォーカスしたいと思う。

TEXT_テラオカマサヒロ(Galaxy of Terror
EDIT_山田桃子 / Momoko Yamada

AOVs

以前にも少し紹介したが、最近のレンダラはだいたいAOVs(Arbitrary Output Variables)と呼ばれるレンダラが画を作る際に計算したものを、副産物的に別々に出力できたりする。

mtoa(arnold for maya)でのaISurface(alShaders)でのAOVsのインターフェイス例。デフォルトではないが、www.anderslanglands.com/alshaders/index.htmlで配布されているalShadersはとても強力だ。

場合によっては画を作る際に計算したもの以外のものも出力できることもあるが、そんな感じで3DCGの完成画を構成するための各要素のようなものを出力できる。

この手の話の上で、3DCGの完成画は"beauty"とよばれる。beautyは"direct diffuse(直接拡散反射光)""direct specular(直接鏡面反射光)""indirect diffuse(間接拡散反射光)""indirect specular(間接鏡面反射光)""refraction(屈折光)""sss(表面下散乱光)"などで成り立っている。

レンダラによって名称が違ったり若干出力できるものが違ったりするが、概ねはこれらで構成されている。今回は、読者にもなじみのあるV-Rayを用いて進めたいと思う。

V-RayにおけるbeautyがAOVsに反映できる構成要素は"lighting(直接拡散反射光)""specular(直接鏡面反射光)""GI(間接拡散反射光)""reflection(間接鏡面反射光)""refraction(屈折光)""sss(表面下散乱光)"となっている。

V-RayでのAOVsのインターフェイス例。V-Rayはデフォルトである程度のAOVsの出力が可能になっている。特にカスタマイズを必要とせずライトコンプを行うことができる。shadow(collector)系のAOVsがでないのは少し残念ではある

そして、beautyはこれらのレンダーパスの足し算でできている。つまり、beauty="lighting"+"specular"+"GI"+"reflection"+"refraction"+"sss"である。
※V-Rayではdiffuseをlightingとよんでいる

左がbeautyそのもの。右がAOVsからbeautyを再現したもの。今回の例の場合、refractionとsssが構成要素として無いので、beauty="lighting"+"specular"+"GI"+"reflection"で再現している。

上記のように各構成要素から3DCGの完成画をコンプ内で再度つくり上げることを、便宜上、ここではbeautyの再構築と呼ぶことにするが、beautyの再構築の利点は、たとえば、CGオブジェクト上のある光沢だけを消したい時や、たとえば、回り込んでいるライティングを強めたい場合など様々なケースでbeautyの再構築にはアドバンテージがある。後者の例は、上記であげた構成要素以外にnormalと呼ばれる法線情報が必要になったりする場合もあるが最近のレンダラであれば、それもAOVsとして出力が可能だ。

normalパス。各ピクセルがX,Y,Zの方向をどれだけ向いているかをRGBにそれぞれ格納している。RGBをの各チャンネルをバラバラに見てみると、その役割が分かりやすい。黒くなっているところにもマイナス値で情報は存在している

次ページ:
per light AOVs

[[SplitPage]]

per light AOVs

AOVsを用いた、beautyの再構築からのCGコンプを行う前に、もうひとつ紹介しておかなければならないものがある。per light AOVsと呼ばれる、上記で紹介したAOVsをさらに光源ごとに分けたものである。これに関してはレンダラによっては対応していないのもある。今回、用いるV-Rayでは、light selectとよばれ、またこのV-Rayのlight selectは直接光においてだけ有効である。

V-Rayのper light AOVsであるlight selectには出力タイプとしてNormalRawDiffuseSpecularが準備されている。なぜかここだけlightingではなく、標準的な「Diffuse」という表記になっている。NormalはDiffuseとSpecularを足したもの、RawはRaw DiffuseとRaw Specularを足したものということになっている。Raw Diffuse、Raw Specularはそれぞれ、Diffuse、Specularをカラー情報(diffuse color texture)で割って、Raw(生)なシェーディング情報を得ることができるものである

つまりV-Rayでは、light select(per light AOVs)を用いてlightingとspecularが光源ごとに出力が可能になる。per light AOVsを用いると、環境光だけ弱めたり強めたり、ある光源からのスペキュラだけを取り除いたりと、CGソフトウェアでのライティングでやるようなことが再現できたりする。そして、これこそがCGコンプにおいて求められていることのひとつである。一度、3DCGソフトウェアで行なったライティングで算出された情報をAOVsという形でキャッシュしてコンプ上で再度ライティングしているような感じである。実際にはもっと2D的にコントロールすることが多い。つまりロトなどを用いて、部分的に各要素を調整するといったようなイメージである。

AOVsをレイヤー(チャンネル)で格納しているデータの流れであれば、そのデータの流れ上のどのノードであってもViewer越しにもっているレイヤー(チャンネル)を確認できる。この場合、たとえば、ls0_diffというのはlight selectでlight0というライトを指定したdiffuseという意味で命名している。同じくls1_specはlight1で生じるspecularになる

light select(per light AOVs)だけ表示した例。各々のライトがどのように作用しているかが見て取れる。CGライティングを受け取って、まず最初に確認してその役割を知っておくとライトコンプをする上で指針をつくりやすい

次ページ:
基本は球体デッサン

[[SplitPage]]

基本は球体デッサン

ここからは、実際にAOVsを用いてコンプをしたいと思う。今回の例の場合、腹の辺りの形の見え方がいびつになっている。これをコンプで整えたいと思う。

beautyで見られる、キャラクターの腹と首のあたりにある"いびつ"さを自分なりに評価してみた。丸いものは丸く見せるというのが基本大前提であり、この辺りは球体デッサンに繋がる部分が多い

実際の手順としては、まず、コンプとして用いることができるAOVsを確認する。今回はper light AOVsでligh selectを用いたlighting(diffuse)とspecular、そしてGIとreflectionを用いる。また、normalとポーズリファレンスのposition(pref)がAOVsに含まれている。

今回はAOVsをOpenEXRのマルチレイヤー機能を用いてひとつの画像データに格納しているが、それらをLayerContactSheetノードを用いて、一度に表示してみた。どういうチャンネルがあるか一度に確認できるので便利である

まずはNUKEのviewerの機能であるexposureとgammaを用いていびつになっている理由を探してみると、本来、球体的に感じたい腹のあたりに球体と感じるのを邪魔する広範囲に照らされた部分があるのが見て取れる。これはデッサンでいうところの明暗境界線を探しているようなもので、その形状に沿った明暗境界線でないと、観察者が適切な形状とボリュームを感じることが難しくなる。

viewerのexposureとgammaを用いて、画像の情報を"極端"にしていみる。すると、デッサンでいうところの明暗境界線が分かりやすく浮き出して来て、その明暗境界線が、想像している形状に沿わずに、水平気味にはいっているのが見て取れる。これが"いびつ"に感じる原因だ

そこで、各light selectパスを確認して、どの光源がそれを引き起こしているかを見つける。

light selectを眺めて、少しだけずれて形状を把握しづらくしているスペキュラや、いびつな形状に感じさせてしまっているdiffuseなどを特定する。diffuseでボリュームや形を表現して、specularでディテールを表現するといった役割であると筆者は考える

今回の場合、6つの光源でライティングされている。viewerのexposure機能を用いて探すのも良い。exposureを上げてやっと見つけられるなんて、beautyにあまり影響が無いのでは? と思われるかもしれないが、これがナカナカに影響している。そしてこれこそがコンプの役割のひとつでもある。作例では幾つかの光源の影響を受けて、観察者がいびつと感じそうな部分がいくつかあったので、それらを削除、弱めていった。

再度beautyで確認して、どうすればよく見えるか、すんなりと見て取れるかを考える。CGコンプはこういった細かい作業の連続である

その際、Gradeの選択範囲としてロトを用いても良いのだが、そうするとショットを別のショットでも同じ問題が出たとき、同じような処理をイチからやる必要があるので、選択範囲にはポーズリファレンスのposition(pref)パスを用いて選択範囲をつくった。prefは通常のposition worldパスと比べるとわかるが、キャラクターが移動、変形してもキャラクターの各場所に必ず同じ色がくるようになっている。

prefをフレーム毎にContactSheetで並べてみた。ContactSheetにはこのように、フレーム毎に表示させる機能もあり、こういうものを評価するのにとても便利だ。ちなみに、この図からもprefで表現している色がキャラクターの動きに追従しているのがよくわかる

こちらはpWorldをフレーム毎にContactSheetで並べてみた様子。フレーム(空間位置)によって色が変化しているのが見て取れる。これだと、選択範囲をつくっても滑ってしまう

これを用いて、キャラクターのサーフェイスに存在するある点(色)からの距離に応じた選択範囲をつくる。要するに球体のボリュームで選択しているような感覚である。これで、キャラクターが移動、変形しようとも、キャラクターのサーフェイス上のある範囲を選択することができる。キャラクターのモデルをショット毎に変更しているわけでなければ、prefはショット毎にかわらず、ショットをまたいでもこのような処理が可能になる。

prefのあるピクセルのrgb情報を用いて(この場合お腹のある点)、そのrgbをpref上でピクセルごとに評価する。今回の場合は、clamp((radius - sqrt(pow2(pref.red-center.x)+pow2(pref.green-center.y)+pow2(pref.blue-center.z)))/radius)といった感じで、その指定した点(center.x, center.y, center.z)からの距離で評価している。その距離がradiusというユーザー変数で指定した数値よりも小さければ、その距離に応じてマスクの強度が変わるような数式になっている

マスクをmatteモードで表示させた例。画像左はprefで行なった例で、キャラクターが動いて変形しても常に同じサーフェイス上を選択出来ているのが見て取れる。対して、画像右はpWorldを用いた例。こちらはマスクが空間に固定してしまって、キャラクターが動いて変形するとそのマスクが滑っている

今回は特に行なっていないが、この手の形状の場合はキャラクターの輪郭部分が回り込んでいて、回り込んでいるということはサーフェイスが広範囲に外を向いているということで、周りからの影響を受けやす部分になっていることが多い。つまり見かけ上狭い面積ではあるが、サーフェイス上はある程度の面積があるはずで、かつ広範囲に光を集めていることが考えられる。もっといえば、これも球体デッサンと同じで、エッジはかすかに明るくなっていると観察者が丸みを感じやすい。

その反面、球体デッサンでは光源でのハイライトの反対側で明暗境界線の陰の方に含まれて、かつ床からの照り返しの影響を最も受けないところに一番暗い部分をつくる。これと同じく、観察者が感じられるぐらいの暗いスポットをつくってやる。そうすることで、観察者に、より立体的であると認識できるように整えていく。

beautyの再構築を大きくノードグラフで組んでも良いのだが、簡単にやるときは、筆者は必要なチャンネルを一旦beautyからマイナスして(Bラインを維持するためmergeのfrom)、そしてそのチャンネルをgradeしてプラスで戻す。こうすると、簡単に1チャンネル(レイヤー)ずつ簡単に調整ができる。ただし、同じチャンネル(レイヤー)を複数回gradeしたいときには不向きである

と、ナカナカと微細な話になってしまったが、これを繰り返すことで、ライティングから受け取った3DCGをより良くしていく。また、この手の作業をやるとどうしてもどうしても、元々もっていた情報を削除しすぎて、画がフラットになることもしばしある。これはやはりよろしくなくて、元々の情報を損なうこと無く、形を整えてボリュームを出す必要がある。

今回はAOVsの利用方法を説明しつつ、コンプで形状を整えるということを伝えたが、もちろんCGコンプはこれに限ったことではなく、むしろこれはそれのかなり細かな部分である。機会があれば、今後、その他のCGコンプについても紹介できればと思う。

ココまでに説明してきたテクニックなどを用いて形状を整えてた。左が処理済み、右がオリジナルである。viewerノードのgamma、exposureを用いて明暗境界線を明らかにしてみると、処理済みの方が綺麗な曲線がでているのが見て取れる

おまけ。テクスチャが複雑になると、ライティングによる形状が把握しづらくなる。そういう場合は、V-Rayでいうところのraw lighting、つまりdiffuse(V-Ray)のレンダーエレメントのlightingをテクスチャカラー(V-Rayのレンダーエレメントのdiffuse)で割ると、テクスチャカラーを取り除いた、つまりdiffuse colorに(1,1,1)を用いたシェーディングの状態が見れるので、形状が把握しづらい場合にはこういうことが指針になったりする

Column.
車が......!!

先日、車を運転していたら突然アクセルを踏み込んでも、まともに加速しなくなり、これはおかしいと脇道にそれ、その数十秒後にはエンジン停止して完全にとまってしまうというとても怖い体験をしました。車は修理して今はまともに動いていますが、レッカーを呼んだりと、初めてづくしの恐ろしい出来事でした......。


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

株式会社ギャラクシーオブテラーにて VFX ディレクターとして活躍中。
実写合成からフルCGまで幅広いVFX制作に携わっている。
個人サイト「tiraokan.」