株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • 役に立たないどうでもいい話-RenderLayer Overrideの話

役に立たないどうでもいい話-RenderLayer Overrideの話

2012/7/25

Tag: ,

どうも久しぶりです。真っ黒になったおっさんのJです。暑いですね~東京は。
さてバイオハザードの新しいムービーのトレイラーも公開されたわけですし、
今回はバイオの作業で問題になってたRenderLayerのOverrideの話をしたいと思います。
プログラムとかなく単に文章で書いていくので眠くなるとおもいますが最後まで読んでいただけると幸いです。

普段何気なく使ってるRenderLayerのOverrideはかなり便利な機能です。
まあ、この機能がなかったらレイヤ別にシーンを個別に作るしかないので
ユーザーにとっては
・余計なHDDスペース使用の軽減
・シーンの管理の一元化

などと今の複雑な作業現場ではなくてはいけない機能でもあります。

ただ、この機能は落とし穴があるということが最近わかりました。
それもリファレンス機能と一緒に使用した場合はとんでもないことになる場合があるのも気づきました。
皆さんは既にご存知だったかもしれないですが・・・。

さて詳しく見てみましょう。
MELを使ってる方はRenderLayerのOverrideの機能は2行で行うことをご存知かと思います。
①Overrideの準備 → editRenderLayerAdjustments
②必要な設定 → 多くはsetAttrやsetsなど

です。
尚、この作業はOverrideを行う個数分発行しないといけないです。
どういうことかというとたとえば
1000個のオブジェクトがシーン上に存在します。
あるレンダーレイヤでこれらのオブジェクトのRender StatsのCastsShadowsをoffにするOverrideをしないといけない

としましょう。
それは
①editRenderLayerAdjustments objName.castsShadows
②setAttr objName.castsShadows 0

上記の①、②が1000回行われるということです。
MayaのシーンのなかみはASCII方式で保存してみるとわかりますが、ベタのMELコマンドの羅列です。
1000個のオブジェクトをRenderLayerでOverrideして確認すると軽く2000行が追加されてます。
機能としてはただマウスとキーボードでささっと設定しただけなのに恐ろしいことに
場合によっては2000行が追加されるわけです。
幸い全てのオブジェクトがそのシーンの中に存在する場合は①と②だけ追加されるだけ済みますが、
リファレンスだとMayaは親切(?)にもう一つの作業を追加してくれます。
placeHolderList
です。
これは何をするものかというとリファレンスしたオブジェクトが何かしら変更が
行われた場合その情報を保持するためのものです。
分かりやすく言うとリファレンスでシーンに読みこんだあとリファレンスオブジェクトにアニメーション作業を
行った内容はこのplaceHolderListを通して覚えているわけです。
これが多ければ多いほどリファレンスで作られたシーンは再現に時間がかかり、シーンが開かれても
しばらくの間ユーザーにコントロールを渡してくれないのはこのplaceHolderListによる再現を
行っているのでおきるわけです。
リファレンスしたシーンで作業しているとだんだんシーンを開くたびに時間かかるなと感じた場合が
あると思いますが、これが原因なのです。

さてplaceHolderListとOverrideはどのような関係があるのか?
それは多くかかわってきます。placeHolderListがリファレンスしたオブジェクトの変化を
記憶するわけなのでOverrideもplaceHoilderListの対象になります。

先ほど想定していたシーン(1000個のオブジェクトが入ってるシーン)をリファレンスしたシーンの中で
RenderLayerでこの1000個のオブジェクトをOverrideするとどうなるかというと
①placeHolderListの追加
②editRenderLayerAdjustmentによるOverride準備
③setAttrによる値のセット

の3行になります。
先は2000行の追加でしたがリファレンスだと3000行が追加されます。
1000行の違いはかなり大きいです。
さらに厄介なのはAttributeのOverrideより、シェーダーのOverrideのほうが処理的に重いことです。
シェーダーのアサインしなおしは内部的にmeshとshaderのコネクションをしなおす作業になり、
余計に負荷がかかるので実際はRenderLayerでのシェーダーのOverrideは500個以下が望ましいです。
なのでオブジェクトの数が多い場合はなにかしら方法を講じないと作業時間のロスやレンダー時間のロスに
つながるわけです。

作業時間のロスという面ではRenderLayerを移動するたびにえらく時間がかかるのが問題です。
特にシェーダーのアサインしなおしは場合によっては移動が終わるまで
「しばらくお待ちください」
という砂時計が出て待機状態になるわけです。

今回のバイオでこのレイヤ移動で被害をうけたのがFXチームでした。
弊社のFXチームの作業はキャラ+背景を読み込んだ状態で行います。
背景がそれほど重くない場合はそれほどでも問題がないですが、今回のバイオの場合は
オブジェクトが20000個を超えるものもあるし、RenderLayerのOverrideでレイヤ別にシェーダーの
アサインをしなおすケースが多かったです。
シーンが重いのはなんでだということで依頼がきたので色々と調べてみるとやはり、
①背景のリファレンス → placeHolderListの増大
②シェーダーのOverride → overrideによるレイヤ情報の増大

が原因でした。
①は今回のバイオのために頑張って作り込んだ背景シーンがあまりにも
大きいのでシーンの中にImportすると2Gを超えてしまい、バイナリーの保存は不可能でした。
それで容量の制限なしのASCIIに保存すると6Gを超えるのでカットシーンの容量として向いてないということで
リファレンスのままにしておくしかなかったのです。
そうだとしたらいかに②の情報を減らすかを考えないといけなかったので
苦し紛れの策として思いついたのがシェーダーのOverride方法の見直しでした。

MayaでのシェーダーOverrideは普通はshadingEngineで行います。
renderLayer1ではオブジェクトにshadingEngine1で
renderLayer2ではオブジェクトにshadingEngine2で
という形でシェーダーのoverrideを行います。
ただこの方法だと、たとえば1000個オブジェクトがあった場合に、1000個分のオ ブジェクトのOverrideが発生するので
問題解決にはならないわけです。
それでバイオで思いついたのは
MasterLayerでアサインしたshadingEngineは変えずにshadingEngineのコネクションをOverrideする方法
です。
下図を見ると違いが分かると思いますが、shadingEngineのMaterialコネクションをoverrideで違うMaterialにするわけです。

画像では単にSurface Shaderのコネクションを別のMaterialにしていますが、
矢印でさしているMentlaRayのMaterialなどのコネクションもOverrideが可能です。

このような方法だと1000個のオブジェクトに対するシェーダーの割り当てのoverrideは場合によっては1回ですむわけです。
同じshadingEngineに1000個のオブジェクトがアサインされていればOverrideで1000個のオブジェクトにシェーダーを
アサインしなおすのではなく、そのshadingEngineのMaterialコネクションを別物に切り替えるようにするだけの1回のOverrideだけです。
実際この方法でシェーダーのoverrideをしてみるとレンダーレイヤ間の移動はかなり軽くなります。
なんという軽さだと結構感動しますが、この方法で当てられたシェーダーがあるレンダーレイヤは場合によっては
Mayaをクラッシュさせるといった致命的な問題があります。
特に100%クラッシュさせるのはShadingEngineのコネクションをOverrideして作ったRenderLayerを
下図のように「Copy Layer」でコピーした場合と

そのレイヤを選択した状態でHyperShadeのWindowを開いた時です。
その原因はオートデスク側に聞いてみるとMayaのバグである可能性が高いとのことなので
今のところは解決方法がなく、どうしてもRenderLayerのシーンが重い場合などだけに限って使用しています。
とほほ、なので現在はRenderLayerを使ってるのでこのような方法でRenderLayerの処理を軽くしていますが、
今後はRenderLayerを使うのではなくRenderPassを使いこのようなOverrideによる負荷の軽減を目指したいと思っています。

最後はちょっと休みをもらって去年行ってた石巻に行ってきた話をさせてください。
去年この街はきれいになるのだろうか?と思いながら作業してた瓦礫や泥だらけの街が店が再開したり、
人も戻ってきて復旧しつつありました。街の中の瓦礫や泥はなくなったけど海辺に山のように
積んである瓦礫が去年と変わらず憂鬱にさせました。
だが、自分でボランティアに行き、こんな泥かきしてなんの役に立つのかと思いながら
作業してた家に元の住民(おばあちゃん)が戻ってきて生活をしていたのを見たときでした。
去年皆で苦労してたのは無駄じゃなかったと胸が熱くなりました。
漁業支援しながら話した漁師さんが去年より明るくなっていてうれしかったです。
まだまだ先は長いですが、早く復旧の段階が終わり、復興してほしいと願ってます。
皆さんも余裕があったら東北へ旅行にいき、色々と変わってきた姿をみてください。

つまらない内容を最後まで読んでいただきありがとうございました。

Pocket

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*