好きに生きる

3DCGを仕事にしていくブログ

【Arnold,MAYA】実践的なレンダー設定をしようvol2_AOVs編【TIPS】

引き続きレンダリングの話です。今回はAOVsの項目について。マルチパスレンダリングと呼ばれるレンダリングの方法について。

 

前回の記事➡https://yuki-cg-blog.hatenablog.com/entry/2019/08/02/012436

 

AOVsとは? 

レンダリングした画像は通常1枚の画像として書き出されます。

これがbeautyと呼ばれる画像です。

ArnoldにはAOVs(Arbitrary Output Variables)というレンダリング時に各要素の画像出力を可能とするシステムがあります。その要素とは色、直接光、間接光、反射、モーションブラー、Z深度etc…と絵を構成している要素です。

 この要素がbeauty画像を作っています。

 

 

f:id:yuki_cg_blog:20190915143800p:plain



 

 何故マルチパスで書き出すのか?2つのメリット

マルチパスで書き出すメリットとして大きなものは以下の二つ。 

 

レンダリングノイズの原因の特定によるレンダリング時間の最適化が出来る。

②コンポジットでいろんなことが出来るようになる。(素材単位での合成、被写界深度(DOF)やモーションブラーの値を後付で調整、IDマップによるマスク切り、個別色調補正、etc......。実写合成においても非常に有用)

 

 

 具体的に説明していきます。

 ①レンダリングに付きまとう問題としてレンダリングノイズがあります。これを消すためには通常Camera(AA),Diffuse, Specular, Transmission,SSS,Volume Indirect,各ライトなどのサンプル値を上げていきます。

 

f:id:yuki_cg_blog:20190915164718p:plain

 

各パスに対するrayのサンプル値を上げていくほど計算回数も増え綺麗な絵になっていきますが、レンダリング時間も二倍、三倍と増えていきます。

 

しかし当てずっぽうにBeautyだけを見て各成分のサンプル値を弄っていては、ノイズの原因がDiffuse,なのかSpecularなのか一見して分からないため非効率です。

 

そこでAOVでレンダーパスを設定して要素ごとに個別でノイズの状態を確認します。

 

f:id:yuki_cg_blog:20190915165002p:plain

ノイズに関連しそうなパスを書き出してみました。橙色で囲ったパスにノイズが載っていることが分かります。

 

ノイズには起因している要素がありその中のどの要素のサンプル値を上げれば綺麗になるのかを調べるのにマルチパスでレンダリングすることは有効な手段です。

 

この例ではdirectにほぼノイズは見られないためこのままで良さそうですが、indirectにはたくさんのノイズが載っています。その中で細かく見てみると中央のLambertは特にDiffuse_indirect、床の反射はspecular_indirectのパスにノイズが見られます。この二つのサンプル値を上げてやれば良さそうです。

 

このようにそれぞれの要素にあったサンプル値を上げてやることで効率よくノイズを改善することが出来ます。

因みにCamera(AA)(このAAはアンチエイリアスの略)は全体のクオリティを底上げしてくれますが、結局は各要素にあったサンプル値が重要です。例えばガラスのマテリアルにDiffuseのサンプル値を上げたところでノイズは消えません。

どこのサンプル値が関係しているのか把握出来るのはメリットです。とりあえずCamera(AA)あげとこは辞めたほうがいいかも?

どこの値が関係してきそうなのかは経験によって培われます。アニメの撮影処理や実写合成などにこの辺のパスは私はあまり使わないので慣れたら省略します。

 

f:id:yuki_cg_blog:20190915164536p:plain

 そして二つ目のメリット。

 ②AEやNukeなどのコンポジットソフトでそれぞれの情報だけを編集出来たり、そのパスを元に他の画像にマスクをかけたりできます。

マルチパスで出力しておけばコンポジット段階で何とでもできてしまうのであまりレンダリング段階で調整に時間をかけなくても大丈夫です。

オブジェクトごとのマスク切りやDOF、モーションブラー、細かな色調補正などをしたい場合、これらは必要なパスを個別に出力してしまえば後で手を加えるのが楽になります。絵を描く人にとってはレイヤーを別にしたようなものです。

 

でも色々できるからこそ初めての人にはわかりにくいですね。

 

例えばBeautyのみでレンダリング画像のキャラの服だけ色を変えたいと思ったら難しいです。そこでクリプトマットやノーマルのパスを個別にレンダリングしておけばマスクが簡単に作成できるので後から気に入らないところだけ色調補正することもできるのです。

 

例えば、仮にDOFやモーションブラーをMAYA内で入れたとしましょう。これらの処理はただでさえレンダリング時間がぐっと大きくなるのですが、こういったブラー系のクオリティに影響する項目はCamera(AA)のみなのでノイズを消したければ必然的にCamera(AA)のサンプル値を上げるしかありません。しかしこの項目は上げれば全体のクオリティが高くはなりますがレンダリングコストが非常に高く結果レンダリング時間が大幅に増えてしまいます。そうして何時間もかけやっとレンダリング出来た画像で問題があった場合レンダリング後の修正も、またレンダリングするのも容易ではありませんよね。

これがコンポでできると、下手をすれば何十時間・何日というレンダリング時間が浮くのでコスパが良いのです!

 

どう使うのか?実践マルチパスレンダリング

f:id:yuki_cg_blog:20190915205659p:plain

下準備

まずは下準備でイメージフォーマットをexrにして、Merge AOVsにチェックを入れましょう。これをしておかないとZDepthが使えなくなったり、パスごとにバラバラに書き出されるので管理が大変です。

 

■プリセットからのレンダーパスの書き出し

MAYA2018リリース時のArnoldには既に使いやすいプリセットが用意されています。

builtinを選択してみます。個別の画像情報として書き出したいパスを選択していきます。

MAYA2019で更新されたArnoldからはプリセットがなくなって最初から一覧が表示されるようになりました。今回はこれで進めていきます。この中から個別の画像情報として書き出したいパスを選択していきます。

 

f:id:yuki_cg_blog:20190915195420p:plain

MAYA2019_AOVsAdd

これによりレンダビューの左上のパスメニューから先ほど選択したパスが選択できるようになっています。

f:id:yuki_cg_blog:20190915195601p:plain

追加したパスの選択

ここで各パスのノイズを見てノイズが乗っているパスのサンプル値を上げていくのです。黒い画像は影響なしということです。逆にこういったパスやノイズが乗っていないパスのサンプル値は計算時間を増やさないように必要最低限まで下げてやります。どこのパスを見ても真っ暗なパスはサンプル値も0にしてOK(SSSとかVolume_Indirectとか使わない場合も多い)。こうしてAOVをチェックしながら設定することでレンダリング時間を抑えることが出来るわけです。

 また後述するパスの不具合が無いかもチェックします。

 

■ここにないもののレンダーパスの書き出しの方法

実はbuiltinのプリセットにAOやライトの個別パスは入ってません。なので自分で追加してあげる必要があります。

AOのレンダーパス

①レンダー設定を開きます。

 

②Add Customをクリック。

 

③自分で分かるように自由に名前を入力します。ここではAOとしました。

 

f:id:yuki_cg_blog:20190915185700j:plain

 

④そうすると下のAOVsタブの一覧に先ほど作ったAOが追加されているのでここからSelect AOV nodeを選択。attribute editorにAOのAOV nodeを表示させましょう。

 

f:id:yuki_cg_blog:20190915192241p:plain

 

⑤Custom ShaderタブのShaderの項目へaiAmvient Occlusionを接続します。

 

f:id:yuki_cg_blog:20190915192415j:plain

 

因みにAOノードに場所はArnold➡Shader➡aiAmbientOcclusion

 

f:id:yuki_cg_blog:20190915192558j:plain

AOノードの場所

余談だがハイパーシェードの中でTabキーを押せば検索窓が出てくるのでそこからノードを作成して、出来たノードを中マウスボタンドラッグで枠にドロップすれば簡単につなげる。効率化を求めるなら覚えておくとよいかも。

 

⑥これでArnold RenderViewのAOVの一覧からAOを選択できるようになりました。普通に書き出すこともできます。

 

普通ならこれでいいはずなのですが、原因不明の落とし穴がありました。

AOを確認してみます。

f:id:yuki_cg_blog:20190915190805j:plain

[mtoa] Translator has already added Arnold node with tag "aov_shader_AO"

 

おや、変な影が出来てますね。

 

[mtoa] Translator has already added Arnold node with tag "aov_shader_AO"

 

というエラーメッセージが表示されています。謎。こういう時は同じ結果を得られるように別の方法を試してみます。

 

 

 

ということでこの画像を参考にしながら別のやり方も試してみましょう。

f:id:yuki_cg_blog:20190915193921j:plain

 

①ハイパーシェードを開きます。

 

②AOを適用させたいaiStandard Surfaceに接続されたStandard SurfaceSG nodeを選択します。

 

③Add Custom AOVをクリック。

 

④自分で分かるように自由に名前を入力します。ここではaoとしました。

 

f:id:yuki_cg_blog:20190915193851p:plain

 

⑤そうすると下のAOVsタブの一覧に先ほど作ったaoが追加されています。

 

⑥この項目へaiAmvient Occlusionを接続します。

 

⑦これでArnold RenderViewのAOVの一覧からaoを選択できるようになりました。普通に書き出すこともできます。

  

これなら正しくレンダリングされました。

f:id:yuki_cg_blog:20190915194149j:plain

AmbientOcclusion

 ※ただし先ほどの方法と異なりAmbientOcclusionが適用されるのは繋いだマテリアルのみです。他のマテリアルにも適用させたい場合は同じように設定します。

 

ライトのレンダーパスの書き出し

次はライトのAOVです。一つ一つのライトも個別に書き出せます。やり方はほぼさっきと同じです。

①ライトを選択しattributeの中のAOV LIGHT Groupの項目をDefaultから自分が分かるように好きな名前に変更します。

f:id:yuki_cg_blog:20190915212816p:plain

②Add Customで名前を付けます。名前を付けるときに”direct_(AOV LIGHT Group名)”にして下さい。これで関連付けされます。

f:id:yuki_cg_blog:20190915201340j:plain

ライトのAOV

③これで一つ一つのライトのパスを書き出せる状態になりました。

f:id:yuki_cg_blog:20190915203057p:plain

 

 

ZDepthについて

余談ですがZDepthをレンダリングしたら真っ白なんですけど⁉ってなると思いますが、これは問題ありません。8bitで書き出すとアウトですが32Bit画像、つまりEXRで書き出せばマイナス値まで情報量を保存しているので露光量を下げてやればグレースケール画像が見えてきます。

ちなみにビューポート上で見たいなら上の露光量を適切な値に下げてやれば見えてきます。

この辺のコンポでの被写界深度のかけ方についてはまた詳しくBlogに書けたら書きます。

f:id:yuki_cg_blog:20190915200605p:plain

露光量を下げると見えてくる

 

 いかかでしょうか。

設定そのものは複雑なことはなくて意外と簡単だったかと思います。コンポジターだけでなく他の職種でも役立つ知識だと思いますのでぜひ使ってみてください。

実写合成をするときなんてすごく便利です。今回紹介しませんでしたが他にもshadow matteとかオブジェクトIDより便利なCryptomatteとか有用なパスは沢山あります。色々使ってみると最小のコストでそこそこのクオリティを目指せるかもしれません!

それぞれのレンダーパスを使って何が出来るのかという話はまたいずれ。

 

次はテクニカルな話じゃなくてアート面の話。絵作りの話を予定してます。それかutilitynode。多分。やりたくなった順......

 

参考になったよという方は、こっちでも作品や情報を発信してるのでフォローよろしくお願いします!

悠木意匠 (@yuki_isho) | Twitter

 

 

参考

https://area.autodesk.jp/movie/maya-2018-digest/rendering-06.html