コマンドラインレンダリングの仕方


どうも篠島です。今回はコマンドラインからレンダリングする方法を紹介したいと思います。

 

今回のサンプルファイルです。
CommandLineRender.zip

 

スタジオではレンダーファームを使用するのでコマンドラインでのバッチレンダリングの需要は低いかもしれません。そもそも Houdini には Render Scheduler という物があり、ローカルマシンでレンダリングする場合でも ROP で Render to Disk in Background を実行すると、スケジュールにタスクを追加してレンダーキューのような物を作ることが出来るので、コマンドラインからレンダリングするメリットは殆ど無い様に見えるかもしれませんが、使い方を知っておくといろんな事を自動化できるので覚えておいて損はありません。また学校ではレンダーファームがなかったりするので、コマンドラインからバッチレンダリングする方法は学生の方には有益かなと思います。

今回はWindows で Command Line Tools を使って説明をしていきます。コマンドプロンプトで階層の移動、バッチファイルなど、基礎的な知識があることを前提として説明しています。

 

 

まずは基礎

コマンドラインからレンダリングするには hbatch コマンドを使います。この時 Houdini Engine ライセンスが消費されます。以前の記事で render コマンドによる ROP Dependancy に関する説明をしたのでよければ参考にしてみてください。

  1. hbatch コマンドでhbatchを起動します。この時、プロンプトで自分がいるパスの場所が重要です。この後にHIPファイルのパスを指定してファイルを開く時などに影響します。下の図ではRドライブ直下のtestフォルダ内から実行しています。
  2. mread コマンドでHIPファイルを開きます。
  3. render コマンドで指定したROPをレンダリングします。-V オプションでレンダリングの詳細(処理中のフレーム)を表示し、-f オプションでレンダリングするフレームを指定します。render コマンド実行中は Mantra ライセンスが消費されます。

これで、/out/mantra1 のROPが1~10のフレームでレンダリングがされます。これによりコマンドラインからレンダリングが出来ましたが、このままでは次のrenderコマンドが打てないので、複数のROPを処理するにはレンダリングが終わるのを待たねばなりません。

 

 

複数のROPを処理する

renderコマンドを使った分だけROPを処理することが出来ますが、Hscript をまとめてテキストファイルにすることが出来ます。例えば下のようなコマンドを render.cmd として保存します。

mread test.hip
render -V -f 1 5 /out/mantra1
render -V -f 1 5 /out/mantra2

 

 

  1. この render.cmd を hbatch コマンドに渡すことで、テキストファイルの中のHscriptを実行できます。
  2. mantra1 の処理が終わったらすぐさま mantra2 の処理に移行していることが確認できます。

 

コマンドをテキストファイルにまとめることで、いろんな事を一括で処理できることが分かりました。これらのコマンドを使って、以下の様に複数のHipファイルから複数のROPを処理させることが可能です。

####### Shot1 ########
mread shot1/fire.hip
render -V -f 1 10 /obj/pyro_import/import_pyrofields/render
opparm /obj/pyro_import/import_pyrofields loadfromdisk on
render -V -f 1 10 /out/mantra1

####### Shot2 ########
mread shot2/water.hip
render -V -f 1 10 /obj/fliptank_fluid/compressed_cache/render
opparm /obj/fliptank_fluid/compressed_cache loadfromdisk on
render -V -f 1 10 /obj/fliptank_fluid/surface_cache/render
opparm /obj/fliptank_fluid/surface_cache loadfromdisk on
render -V -f 1 10 /out/mantra1

 

上のHscriptは2つのシーンファイルをレンダリングする物で、Pyro と Flip シミュレーションの2つのシーンで、Pyro と Flip のジオメトリのキャッシュを作成してから、Mantraでレンダリングするように記述したものです。ここで注意してほしいのが、ジオメトリのキャッシュを取ったら、シーン内でそのキャッシュを読み込む様に設定しないと、Mantra レンダリングした時に再度シミュレーション等がかかってしまいます。なので opparm コマンドでキャッシュ読み込み用のノードの loadfromdisk パラメーターをONにしています。

 

上の図は実際に実行させたものです。スクリーンに全ての情報が含まれていませんが、含まれている部分だけ説明すると以下のようになります。

  1. hbatch に render.cmd ファイルを渡します。最初にPyroのシーンが開かれ、Pyroジオメトリがキャッシュされます。
  2. キャッシュからPyroをレンダリングしています。
  3. 自動的に次のFlip用のシーンファイルを読み込みシミュレーションをキャッシュしています。

 

hscriptのコマンドをテキストファイルにして hbatch に渡すことで複数のHipファイルのレンダリング、オプションをONにする等の操作を全自動で行えることが分かりました。

 

 

応用編

当たり前のようですが hbatch を使うと hbatch で出来ることしか出来ませんが、hbatch 終了後に通常のプロンプトに戻ることでコマンドプロンプトで hbatch 処理後に続けて自動的に何かしらの処理を行うことが出来ます。例えばレンダリング管理システムの Deadline は Draft のジョブという物があり、レンダリング後に動画作成などを自動的に行う機能がありますが、似たようなことをバッチレンダリングで自動的に行う事が出来ます。

動画変換のアプリケーションとして ffmpeg という物がありますが、hbatch を使ってレンダリングを終わらせた後に、ffmpeg によってレンダリング画像から自動的に動画ファイルを作れます。

レンダリング処理に加え、連番ファイルから動画作成するコマンドは下のようになります。以下のコマンドを正しく実行するには ffmpeg がパソコンにインストールされている必要があります。

hbatch < render.cmd

ffmpeg -i “shot1/render/fire.mantra1.%%04d.jpg” -r 24 -vcodec h264 shot1/fire.mov
ffmpeg -i “shot2/render/water.mantra1.%%04d.jpg” -r 24 -vcodec h264 shot2/water.mov

 

上のコマンドを hoge.bat として保存したとします。バッチファイルにすることで、実行した時に中に書いてあるコマンドをそのまま実行します。

  1. バッチファイルを実行するには bat ファイルをダブルクリック、コンソールから呼び出す場合は call コマンドで bat ファイルを渡すことで実行できます。
  2. バッチファイルにかかれているコマンドを上から実行します。 hbatch < render.cmd なので、最初に説明したとおり hbatch に render.cmd を渡して、hbatch が render.cmd 内に記述されているHscriptを実行しながらレンダリングをします。レンダリングが完了するとプロンプトが戻ってきます。
  3. レンダリングが終了してプロンプトに戻り、次に ffmpeg コマンドが自動的に実行され連番ファイルから動画が作られます。もし ffmpeg をインストールしていないとエラーがでます。

 

これでキャッシュの作成、レンダリング、連番から動画作成までを全自動で行う事が出来ました。今回は Windows での説明でしたが Linux 環境ではもっと複雑な事(ファイルの移動、削除、Pythonを呼び出したり、スクリプト完了後にメールで自分に通知したり等)を容易に行えるかと思います。