Mantraの詳細を紹介します。

TEXT_秋元純一 / Junichi Akimoto(トランジスタ・スタジオ/ディレクター)
日本でも指折りのHoudini アーティスト。
手がけてきた作品は数々の賞を受賞している。
代表作に、HIDETAKE TAKAYAMA『Express feat. Silla(mum)』など。
www.transistorstudio.co.jp
blog.junichiakimoto.com


EDIT_小村仁美 / Hitomi Komura(CGWORLD)

Houdiniと共に歩んできた歴史あるレンダラ

Houdiniは、Mantraというレンダラと共に歩んできた歴史があります。その長い歴史の中で、Mantraは大きく進化を遂げてきました。近年、GPUパワーを活用した高速なレンダラが徐々に浸透しつつあります。確かにGPUの力は強大で、その高速なレスポンスは日本のCG制作にとって、なくてはならない非常に強力なツールだと思います。また、レンダリングさえもしない、リアルタイム性を求めるながれも大きくなり、将来的にはCPUベースのレンダリングは淘汰される可能性があります。

そんな中、伝統的とも言える設計の下発展を続けるレンダラ、それがMantraです。Houdiniのバージョンも17を数えます。今回は、時代に見合った機能を追加し続けるMantraの世界を紹介します。古き良きアプローチから現代的なアプローチまでを網羅して、シチュエーションに最適解をもたらすための方法論を考えていきたいと思います。今回の内容は、2回に渡ってMantraとMaterialの両方から解説していく予定です。

今回のHoudiniプロジェクトデータはこちら

01 Engine

レンダリングのエンジンを解説します。


Mantraは大きく3つのレンダリングエンジンに分けられます。1つめは、Micropolygon Renderingです。これは、RenderManが使用していたREYESというアルゴリズムを踏襲したもので、いわばScanline Renderingと呼ばれるものです。特徴としては、レンダリング時にカメラ内(スクリーン内)に入ってきたプリミティブを分割してBoundを取ります。その後、スクリーン内に入っているプリミティブはさらに細かくMicropolygonに分割されます。その細かくされたMicropolygonの頂点に対してShadingを行い、Pixel内を指定したSampleで頂点のカラーをサンプリングします。最後にFilterを適用してレンダリングが完了します。

このため、ディスプレイスメントやモーションブラーなどが得意とされてきました。ただ、近年では、クオリティが求められるレンダリングには使用されなくなってきています。設計の古さから、効率を高めるための設定がマニュアルすぎると言うのも欠点のひとつです。また、その仕様により、スクリーンに入ってくるプリミティブはもれなく計算が行われてしまうこともデメリットになります。ただし、シチュエーションによっては、Scanlineの特性を活かした高速なレンダリングを可能とします。ラインやポイントのレンダリングや、トゥーン表現の際にその力を発揮します。

2つめはRay Tracingです。このエンジンは、デフォルトで最も使われるものです。Ray Tracingはカメラからのプライマリレイがジオメトリに衝突した際にシェーディングが行われ、そこからさらにセカンダリレイが放たれ、それらが最終的にサンプリングされてPixelの色となります。Pixel Sampleでプライマリレイの本数を指定し、Ray Samplesでセカンダリレイを指定します。この際、Noise Level以下のノイズになるまで、Max Ray Samplesで指定された数までレイを飛ばします。こうすることで、AdaptiveなSampleが可能になっています。

Micropolygon Renderingと大きくちがうところは、レイを飛ばす点です。このため、反射や屈折などを容易に計算することが可能です。現状では、Houdiniにおけるデフォルトのエンジンになっており、メモリなどの管理は最適化されているため、通常利用の場合は最速のエンジンとなっています。ただ、レイを飛ばすという性質から、どうしてもノイズが発生してしまいます。プライマリレイのみであればノイズは発生しませんが、セカンダリレイをサンプリングする仕様上、避けられない問題です。

最後はPhysically Based Rendering(PBR)です。Ray Tracingに似ていますが、大きく異なる点として、BSDFによって、物理的に正しいセカンダリレイの反射をシミュレーションする点があります。BSDFとは、Bidirectional Scatter Distribution Function(双方向散乱分布関数)を指します。すなわち、物理的に正しい表面の反射を計算するためのシェーディングモデルを使用して、パストレースをします。このエンジンは特にシェーダ側の設定が重要で、BSDFをシミュレーションできるマテリアルを構築することがカギとなります。その他の設定はRay Tracingに準拠しており、導入しやすい設計と言えます。


今回、3つのエンジンを比較するため、それぞれの特性を活かせるマテリアルを用意しました。Micropolygon Renderingでは、Scanlineの特性を活かすために、Illuminance Loop【A】を使用して、サーフェスとライトのベクトルから内積【B】を求めた設定にしています。

Ray Tracingでは、単純なLambert Model【C】を使用しています。Physically Based RenderingはBSDFに対応しているPBR Diffuse【D】を使用して、それぞれレンダリングしています。

シチューションは、Point Light【1】とArea Light【2】の2種で比較しています。それぞれ見比べてみると、Physically Based Renderingは他2つより少し明るい結果となっています。これは、レイが到達した際に計算される反射や光の値が異なるからだと予測されます。

また、Point Lightの場合は影に大きなちがいはありませんが、Area Lightの場合、そのノイズに大きく差が見られます。Ray TracingおよびPBRでは、Max Ray Samplesの数を1に設定しています。これは、セカンダリレイをもたないMicropolygon Renderingに配慮したものです。それでも、結果としてはご覧の通りです。そもそも、Micropolygon Renderingには面積をもったライトの概念がなく、このようなレンダリングに最適化されていません。逆に、PBRでは点のように面積をもたないライトがそもそも物理的にありえないため、アーティファクトの元となってしまいます。これにより、それぞれに特徴をもっていることが確認できました。

次ページ:
02 Setting

[[SplitPage]]

02 Setting

レンダリングは、通常セッティングで簡単に行うことができるようになっていますが、レンダリングこそ、最大限にオプティマイズをして、ボトルネックを減らすべきフローのひとつだと筆者は考えます。今回は、Houdiniにおけるセオリーとも言えるセッティングを紹介します。

まず、シーン内にレンダリングしたいオブジェクトを用意しますが、今回モチーフとなっているジオメトリはハイポリゴンです。そういった場合には、Delayed Loadと呼ばれる、Procedural Renderingの設定をした方がベターです。まず、空のGeometry【A】を準備します。次にDelayed Load Procedural【B】のシェーダを準備して、レンダリングしたいジオメトリのキャッシュを設定します。このシェーダをGeometryの[Render→Geometry→Procedural Shader]へ設定します【1】。これにより、このGeometryはレンダリング時にのみ読み出される設定となりました。

Mantraでは、レンダリングの際に、中間ファイルであるIFDが出力されます。このとき、IFDにはジオメトリ情報が書き出されてしまいます。例えば、1GB分あるジオメトリがIFDに書き込まれたとして、動いていない今回のようなジオメトリでも、毎フレーム出力されることになります。それが例えば300フレームあった場合では、300GBもの書き込みのボトルネックが発生してしまいます。これは無駄という他ありません。こういった部分の最適化が、レンダリングの高速化につながると考えます。【2】は、Mantraでレンダリングする際の簡単な模式図です。Delayed Loadを行う場合の様子が確認できると思います。

Mantraの設定も重要です。レンダリングの際に必要なCameraを指定します【3】。Rendering EngineはここではPBRを使用しています【4】。次に、[Rendering→Sampling]でイメージのクオリティ、主にノイズを消すための設定をしていきます。Min Ray Samplesを上げることで、イメージの底上げをすることができます【5】。Pixel Samples【6】は、簡単にイメージを綺麗にすることができますが、プライマリレイを増やすことは、セカンダリレイを大きく増やすことになりますので、簡単に上げないように細かな設定が必要です。DiffuseやReflectなど、それぞれの要素のどこにノイズが乗っているか判断し、必要最小限の範囲で数値を調整しましょう。

今回のレンダリングでは、Diffuseの反射も計算をしています。そのため、[Rendering→Limits→Diffuse Limit]の数値を1以上に設定しています【7】。これで、Diffuseの反射をシミュレーションすることができます。その他、必要に応じて、Reflect LimitやRefract Limitなどを最小限にすることでレンダリング時間を削減することができます【8】

レンダリング時に、対象のObjectを選択する必要があります。今回は、Bundle List【9】を使用してObjectを選択しています【10】。こうすることで、レンダリング時のObject選択を自動化することができます。

最後に、IFDの設定です。コマンドライン、もしくはディスパッチャ等を使用してレンダリングする場合、IFDを出力する必要があります。Mantraのライセンスは無料ですが、IFDを出力する、もしくは直接レンダリングをするためにはライセンスを購入する必要があります。そのため、IFDをなるべく軽く迅速に出力し、そのIFDを無料のMantraでレンダリングできるようなフローを構築することをオススメします。

Driverの設定では、CommandでMantraを起動するようになっています【11】。Disk FileでIFDを出力するだけにすることもできます【12】。また、Delayed Loadで設定している場合は、Save Geometry Inlineにチェックを入れます【13】。デフォルトでは、親切にジオメトリを別でキャッシュしてくれる設定となっていますが、今回の場合はせっかくのDelayed Loadの設定が無駄になってしまいます。

次ページ:
03 Operators

[[SplitPage]]

03 Operators

主要ノードを解説します。

●Mantra

今回は主にMantraの紹介となります。今回はいつもの連載とは異なり、作成メインというよりは、Mantraそのものの概要に迫った内容でした。ここで紹介しているノードはあくまでも、Mantraへの出力ドライバということになります。設定した内容をMantraという、外部の独立したプログラムへ送る架け橋の役割を担います。

Mantra自体の詳細は、非常に複雑で、全てを語ることは難しいですが、今回の内容を見てもらえばわかるとおり、近年では主にRay TracingかPBRを使用することが多いです。そのため、設定のほとんどはノイズのリダクションにかかってきていると言っても良いでしょう。シンプルにPixel Samplesを上げていけば綺麗になっていきます。ただし、重くもなります。これがCGにおけるジレンマで、回避できない問題です。そこで、要素を分けて、必要最小限の設定を見つけ出す必要があります。

近年では、ノイズのリダクションに、AIを使ったものも登場してきました。また、冒頭でお話ししたように、GPUを使った高速なレンダリングで、ノイズを有無を言わさず消していくようなアプローチも見受けられます。そんな中で、なぜMantraを使うのか。それは、Houdiniと共に歩んできたレンダラだからこそ、大規模案件に耐えられる安定性をもち、かゆいところに手が届く設計になっているからだと言えます。Houdiniを使っていく上では欠かせないもののひとつですので、便利になっている世の中に負けず、決して高速ではないMantraの良さをぜひ見つけてみてください。


  • 「Houdini COOKBOOK +ACADEMY」
    Houdiniを基礎から楽しく学ぶオンライン講座

    公開日程:毎週金曜日公開(予定)
    価格:1,200円(税込)
    ※第一回「Houdiniの基本概念とインターフェイス」は無料公開中
    受講対象:Houdiniをこれから学びたい方、Houdiniの勉強で挫折した方など
    cgworld.jp/special/houdinicookbookacademy