HoudiniとUnity マテリアル連携のいろいろ

はじめに

HoudiniとUnityの連携は多くの場合、Houdiniで作成・編集したものを、アセットとしてUnityに持ち込みます。その方法は大きくわけて、Houdini Engine for Unityを使って、UnityにHoudiniデジタルアセットを読み込む方法と、FBXやVATなど、何かしらのファイルをHoudiniから出力し、それをUnityにインポートして使う方法の2つがあります。

そして、そのどちらの場合でも、作業の効率上、Houdiniでの編集とUnityへのインポートを繰り返すにあたって、マテリアルの情報を失わないようにキープするという事がとても重要です。そこで今回は、いろいろな形での、HoudiniとUnityの便利なマテリアル連携をご紹介をしたいと思います。

Houdini Engineを使う場合

まずはHoudini Engineを使う場合のお話から始めます。

Houdini Engine for UnityはHDAを介して、Unityの中でHoudiniの多くの機能を使えるようにしたものです。Houdiniだけで完結するのではなく、Unityプロジェクトの中にあるジオメトリなどをベースに、Houdiniを使った処理が行えるのが、大きな利点です。

Houdini Engineで作成したオブジェクトではもちろん、Unityマテリアルも扱えますが、その話の前に一つ、解決したい問題があります。

それは、現在のUnityにはビルトイン、ユニバーサルレンダーパイプライン、HDRPという3つのレンダーパイプラインが存在し、それぞれに対応するシェーダが違う、という問題です。Houdini Engineはこの中の、ビルトインレンダーパイプラインに対応しているので、それ以外のURP、HDRPを使ったプロジェクトでは特にマテリアルを指定しない場合、エラーになってしまいます。もちろんこれはマテリアルをアサインする事で修正できますが、初期状態でエラーになるというのはあまり気持ちがいいものではありません。そしてこれは簡単に解決する事ができるので、まずはこれから見ていきたいと思います。

それではHDRPを使ったプロジェクトで、その方法をみていきます。

まずはHoudini EngineがインストールされたUnityで、ツールバーのHoudiniEngine>Plugin Settingsを開きます。

開いたウィンドウの一番下まで下がると、GEOMETRY以下に、各種デフォルト設定があります。この中の、Default Standard Shaderが、マテリアルの指定がない場合に使われるシェーダです。ここを書き換える事で任意のシェーダがデフォルトとなります。ここにはシェーダのファイルパスではなく、マテリアルのShaderに書かれている形を記入します。HDRPであれば、HDRP/Litという形です。書き換えたらウィンドウを閉じます。

これ以降はHoudiniのオブジェクトをヒエラルキーに加えた時点で指定したマテリアルが使われるようになります。URPでも同様にUniversal Render Pipeline/Litを使う事で最初から正しく表示できるようになります。これで、どのレンダーパイプラインでもマテリアルのエラーなくHoudiniEngineが使えるようになりました。

ひとつ注意点として、Houdini Engineでデフォルトのビルトイン用シェーダは、頂点カラーをベースカラーにブレンドするようになっています。しかし、HDRP、URPのLitシェーダは頂点カラーをブレンドするようには作られていません。

それが必要な場合はShader Graphなどでオリジナルのシェーダを作って対応します。その場合でも、作ったシェーダをDefault Standard Shaderに設定することで初期値として扱う事が出来ます。

次は、Houdini Engineの機能を使って、より具体的に、複数のマテリアルを指定する方法です。

これは、Houdiniでの作業の中で、Unityのための専用アトリビュート、unity_materialを使って実現します。unity_materialはノードで追加することができますが、他の方法でもプリミティブに同じ名前のアトリビュートが追加できれば問題ありません。

プロパティのストリングに、Unityプロジェクトのマテリアルパスを入力します。

これでUnityのHoudini Engineで、HDAをクックした際に、指定されたマテリアルが使われるようになりました。Unityマテリアルを使うと、Houdiniで使われているマテリアルに関わらず、Unityで用意したマテリアルをアサインできるので、Houdiniではマテリアルの設定を気にすることなく作業が進められます。

またHoudini EngineではUnityのオブジェクトを入力に使う事も出来ますが、このオブジェクトにマテリアルが使われている場合、Houdini Engineの内部ではこのマテリアルのパスも、同じunity_materialというアトリビュートに格納します。

よって、ベースとなるオブジェクトのマテリアルを活かしつつ、HoudiniEngineで新しいオブジェクトを生成するという事ができます。

下の例のように、Houdini Engineではunity_materialアトリビュートを使って、自由にマテリアルの指定することが可能です。

FBXファイルを使う場合

続いてFBXファイルを用いた場合のマテリアルの受け渡しについてです。FBXを使ったやりとりではプロシージャル性は失われ、固定化されたデータとなりますが、Houdiniの強力な編集機能で加工されたジオメトリを、Unityに持ち込めることはとても魅力的です。

このモデルはHoudiniでジオメトリの加工やマテリアルのセットを行っています。

これをFBX形式でUnityに持ち込んでみましょう。HoudiniでFBXを出力する最もシンプルな方法はFBX Outputノードを使う事です。グラフにこのノードを追加し、Save to DiskをクリックするとFBXを出力することができます。

出力されたFBXは、そのままUnityにインポートして使用する事ができますが、ここでマテリアルの設定が問題となります。HoudiniからUnityに持ち込まれたマテリアルは、一部の設定以外ほとんどが持ち込まれません。これに何らかの対処をしなければ、HoudiniからUnityにデータを持ち込むたびに、毎回マテリアルを調整することになってしまいます。これを解決するための2つの機能をご紹介します。

まずひとつめはマテリアルの抽出です。

FBXには、出力時のマテリアル情報が含まれていますが、これをUnityで直接編集する事はできません。しかし、import settingsからマテリアルの抽出を行うと、これらのマテリアルを独立したアセットとして取り出し、編集もできるようになります。

マテリアルの抽出は、FBXに含まれる情報を元に新規のマテリアルを作成し、FBX内のマテリアルの割り当てにリマップする形でオーバーライドされています。よって、抽出したマテリアルが不要になった場合などは、いつでもオリジナルの状態に戻すことができます。そして、マテリアルの抽出によって作られたマテリアルは、Houdiniでアサインしたマテリアルと同じ名前になります。この事は二つめの機能でとても重要になるので、少し覚えておいてください。

二つめの機能とは、オンデマンドの再マッピング、というものです。

これを使うと、インポートしたFBXに使われているマテリアル名やテクスチャ名を使ってプロジェクト内のマテリアルを検索し、自動割り当てする事ができます。

このマテリアルの抽出オンデマンドの再マッピングを使うと、一度調整したマテリアルを再度インポートしたオブジェクトに数クリックで適用できるので、繰り返しの作業がとても楽になります。

VATを使う場合

最後はVAT、Vertex Animation Textureを用いる場合のマテリアル設定についてです。VATは名前の通りテクスチャを使って、頂点をアニメーションさせるテクニックとなります。HoudiniではSideFX LabToolsのVertex AnimationTextureノードを使って、VATのためのテクスチャファイルなどを出力する事ができます。

しかしVATはシェーダを使って頂点を動かすので、Unityの方にもVATを再生するためのシェーダが必要です。そして、URP、HDRPに対応したそのためのPackageが、SideFX様から提供されています。PackageをUnityにインストールするためには、まずはHoudiniで、VATを出力するためのノード、Labs Vertex Animation Texturesのパラメータを開きます。このパネルにはシンプルとノーマルモードがあるので、これをノーマルモードに切り替えます。次にEngineをUnityに切り替え、パネルの一番下まで行きます。ここには複数のタブがあるので、これをSample Shader Codeに切り替えます。一番上にある、Unity Package Pathのアイコンをクリックすると、パッケージのパスが、クリップボードにコピーされるので、そのままUnityに移動します。

Unityではウィンドウ>Package Managerでウィンドウを開き、左上の+ボタンからAdd Package from disk…を選択します。開いたタイヤログウィンドウのフォルダパス上でペーストを実行すると、パッケージファイルの場所に移動するので、ここに置かれたPackage.jsonを選択します。あとは通常のPackageのインストールと同じ手順で、SideFX Vertex Animation Texturesのインストールは完了です。

続いて実際に、VATをUnityで動かしてみましょう。

最初にHoudiniから出力したデータを、全てUnityにインポートします。インポートした中にはVATのテクスチャファイルがあるので、このインスペクターを開き、sRGB、2の累乗以外のサイズ、ミップマップの生成を全てオフにします。最後に、PC向け設定の形式を、RGBAハーフに切り替え、適用します。

次にマテリアル、VAT_Unity_matを選択し、ポジションマップに先ほどのテクスチャをセットします。マテリアルはVATの種類によって、多少の違いがあります。そしてこのマテリアルを、FBXファイルのマテリアルにマッピングすれば、セッティングは完了です。シーンに配置すると、Houdiniで作ったアニメーションが再生されます。

このVATを扱うマテリアルのシェーダはShader Graphで作られているので、誰でも簡単に編集することができます。シェーダを改造したものに切り替えると、質感が表現されたマテリアルが確認できました。

まとめ

今回は、Houdini Engine、FBX、VATを使った場合に、それぞれマテリアルの設定を失わない作業方法をご紹介しました。HoudiniとUnityのマテリアル連携は、マテリアル自体を直接やりとりするのではなく、Unityで用意したマテリアルに差し替える仕組みを保持する事で、負担なく実現できます。みなさんもぜひご活用ください。