Houdini Vertex Animation Texture 3.0をUnityで使う方法

HoudiniのLabs Vertex Animation Textures ROP 3.0(以下、VAT ROP)を使用して、UnityでVertex Animation Textureを行う方法について解説します。

検証に使用しているバージョンは以下の通りです。

- **Houdini:** 19.0.455
- **Houdini Labs:** 19.0.455
- **Unity:** 2021.2.9f1
- **URP:** 12.1.4

## 概要

HoudiniではVAT ROPを使用することでVertex Animation Textureに使用するテクスチャなどのファイルを書き出すことができます。
VAT ROPには複数のバージョンがあり、この記事ではバージョン3.0を使用しています。VAT ROP 3.0を使用するにはUnityバージョン2021.20b3以上、URPバージョン12.0.0以上が必要になります。
使用しているバージョンの確認・変更を行う場合は、`Windows > Asset Manager > Configuration > Asset Definition Toolbar`を`Show Always`にして、Parameterタブの上部に表示される`Asset Name and Path`から行います。
[Labs Vertex Animation Textures ROP 3.0の公式ドキュメント](https://www.sidefx.com/ja/docs/houdini/nodes/out/labs--vertex_animation_textures-3.0.html)

VAT ROP上部にある`Target Engine`を`Unity`にすると、Unity向けの書き出し設定になります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/778182e7-79c1-2607-bdea-79fe9c142a21.png" width="50%">
`Real-Time Shaders`タブで`Unity Package and Guides`ボタンをクリックすると、Vertex Animation TextureをUnityで使用するためのシェーダーやドキュメントを含むUnityパッケージが存在するディレクトリを開くことができます。
Package Installation Guide.txtを参考に、UnityのPackage Managerで`Add package from disk...`からpackage.jsonを指定してインポートします。インポートすると、Projectウィンドウに`/Packages/SideFX Vertex Animation Textures`が追加されます。

VAT ROPはUnity向けにメッシュ、テクスチャ、Unityマテリアルを書き出します。これらをVAT Import Settings Guide.txtを参考にUnityにインポートします。
メッシュのImport Settingsは次のようにします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/b01431c2-a731-0dd5-8e7f-1dc20358df68.png" width="50%">
テクスチャのImport Settingsは次のようにします。この設定はテクスチャがHDRのときでNon-HDRのときは`Format`を`RGBA 32 bit`にします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/ef2c3487-253b-b63a-12ab-bb83dfab442d.png" width="50%">
Unityマテリアルは、テクスチャを除いてパラメータは書き出し時にすでに設定されています。テクスチャのみ一緒に書き出されたものを適切に設定します。シーンにメッシュを配置してマテリアルを適用することで、Unity上でVertex Animation Textureを実行することができます。

VAT ROPには次の4つのモードが存在します。

- **Soft-Body Deformation (Soft):** トポロジーが不変の変形
- **Rigid-Body Dynamics (Rigid):** RBDシミュレーション
- **Dynamic Remeshing (Fluid):** トポロジーが可変の変形
- **Particle Sprites (Sprite):** パーティクル

ここからは各モードごとに試します。

## Soft-Body Deformation (Soft)

Vellum SolverでClothシミュレーションを作成します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/6621d36f-cd89-ff44-5324-e1645ca09df9.png" width="50%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/d41d4699-545b-178d-e0b6-bdc4ead2baf4.png" width="50%">
VAT ROPの`Mode`を`Soft-Body Deformation (Soft)`に、`Input Geometry`を対象のオペレータ(上のネットワークでは`OUT_Soft`)にして、`Render All`ボタンを押して書き出します。

書き出したファイルをUnityにインポートして、シーンに配置すると次のようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/372a6d22-8a6b-acf6-778d-73b57ac4471e.png" width="50%">


## Rigid-Body Dynamics (Rigid)

RBDシミュレーションを作成します。このモードではPacked Primitiveが必要なのでAssemble SOPを使用しています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/66759ab9-3929-91c9-301e-bc548f32e4d4.png" width="50%">
DOPネットワーク(`dopnet1`)の中は次のようになっています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/e81882db-69ba-0734-bef9-5e6cedf0c6d8.png" width="50%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/f6c602e0-34fd-9e0c-164b-fa9d54e5c606.png" width="50%">
VAT ROPの`Mode`を`Rigid-Body Dynamics (Rigid)`に、`Input Geometry`を対象のオペレータ(上のネットワークでは`OUT_Rbd`)にして`Render All`ボタンを押して書き出します。

書き出したファイルをUnityにインポートして、シーンに配置すると次のようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/1e638af8-8921-ca40-4179-ed301e456c53.png" width="50%">


## Dynamic Remeshing (Fluid)

Flip SolverでFluidシミュレーションを作成します。Particle Fluid Surface SOPはデフォルトでPolygon Soupを出力しますが、このモードではPolygonが必要になるので、`Convert To`プロパティを`Surface Polygon`にします。書き出すテクスチャが大きくなりすぎないようにPolyReduce SOPを使っています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/cd9dcf0e-1669-1a4a-bd28-b14d1ea35845.png" width="50%">
DOPネットワーク(`dopnet1`)の中は次のようになっています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/d0467f35-1b72-3967-5fd6-5849f65ed2a8.png" width="50%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/81f7b065-d74f-2c03-f89e-e9fd900d5988.png" width="50%">
VAT ROPの`Mode`を`Dynamic Remeshing (Fluid)`に、`Input Geometry`を対象のオペレータ(上のネットワークでは`OUT_Fluid`)にします。このモードでは、2回書き出しをする必要があります。まず、`Settings`タブの`Render Pass`プロパティを`First Pass`にして`Render All`ボタンを押して1度目の書き出しをします。その後、`Render Pass`プロパティを`Second Pass`にしてもう一度`Render All`ボタンを押して2度目の書き出しをします。

書き出したファイルをUnityにインポートして、シーンに配置すると次のようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/a1fabc33-400f-d7ef-7b64-cde6c47b759c.png" width="50%">

## Particle Sprites (Sprite)

POP Solverでパーティクルシミュレーションを作成します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/2ac61f13-3858-763f-c1f9-bdf4e7df26a0.png" width="50%">
DOPネットワーク(`dopnet1`)の中は次のようになっています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/c4d6ac4a-fedc-cd97-44ee-e2d29a35c303.png" width="50%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/20b0181e-cda5-c27b-749b-ea07f393b43b.png" width="50%">
VAT ROPの`Mode`を`Particle Sprites (Sprite)`に、`Input Geometry`を対象のオペレータ(上のネットワークでは`OUT_Sprite`)にして`Render All`ボタンを押して書き出します。

書き出したファイルをUnityにインポートして、シーンに配置すると次のようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/bef7edb0-9f28-ccac-70b6-7733670f86fe.png" width="50%">

## その他

SideFXから提供されているシェーダーはテンプレートとして利用できるので、必要であれば複製してカスタマイズします。
URP対応となっておりますが、Shader GraphのGraph InspectorのTarget Settingsに`HDRP`を追加することでHDRPでも再生することができました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/c90a63ca-dda3-92cb-a653-26c2f2fd2e7d.png" width="50%">