初めに
初Qiitaです。練習がてら書きます。
出力してUE4まで持ってくる記事は世にたくさんあると思うので、今回はHoudiniから出力されたUE4用VATマテリアルのかゆい所を少しましにする小ネタを紹介しようと思います。
長かったので2つに記事を分けています。今回の法線周りで、次回は区間ループ再生があります。
VATとは
Vertex Animation Textureの略で、頂点や法線のアニメーション情報を焼きこんだテクスチャをマテリアル(シェーダー)で参照し、頂点および法線を変形させます。主にHoudiniのGameDevelopmentToolsから出力します。毎フレーム頂点数やポリゴン数が変わるものや、骨の数が多すぎてリアルタイムでは表現が難しい事を実現するために使う事が多く、機能が近いものにAlembicなどのジオメトリキャッシュがあります。
ジオメトリキャッシュとの違い
- 処理がほぼGPUで完結している
マテリアル内でテクスチャを参照してるだけなので、実行時にCPU-GPU間の転送コストがほぼかかりません。(細かいパラメータのコンスタントバッファの転送コストやFPテクスチャのフェッチコストはかかります)
したがって、ジオメトリキャッシュより軽量に描画することができます。
- メモリは増加しがち
現状ではジオメトリキャッシュと違い、位置テクスチャのストリームなどが完全にはできない為、アニメーションの全尺をメモリに乗せる必要があり、メモリを食ってしまう傾向があります。
レイトレ非対応
VATの肝であるWPOがレイトレ対応していないので正しくレンダリングされません。※4.23でスキンメッシュに関してはレイトレ対応されたので、スタティックメッシュもそのうち対応されることを待っています。
※4.24より、アクター単位でレイトレ時にWPOを使用するかどうか選択できるようになりました。(ISM,HISMはまだ)
本題、インスタンシング対応法線
VATを作ると、UE4ではスタティックメッシュ扱いになるので、ISMでインスタンシングしたくなります。しかしながら、Houdiniから吐かれたUE4マテリアルを使うと以下のようにローカルスペースの法線になってしまい、正しくライティングされません。
これは、法線をトランスフォームしていないだけなので、VectorTransformを一発かければOKという風にみえますが、ISMの場合はコツがいります。
元は↓のように、トランスフォームされていない、テクスチャから参照された生の法線がそのまま出力されています。
かなりシンプルになりました。まず、カスタムUVを用いたVS-PS間の法線の受け渡しをやめ、VertexInterpolatorを使うようになっています。
そして、トランスフォーム先をタンジェント空間へ設定しているのでTangentSpaceNormalのチェックを外す必要もなくなりました。
ここがキモ
VertexInterpolatorを使った理由はもう一つあります。前途したISMの場合必要なコツとは、必ずトランスフォームを明示的にVS内でやらなければならないとうことです。VSトランスフォームする場合、法線×インスタンスマトリクス×アクタートランスフォームが行われ、意図した結果になりますが、これをPS内でやると、インスタンスのマトリクスが飛ばされてしまうのです。ですから、明示的にVS内で処理をしていると言う事がわかりやすいVertexInterpolatorを使いました。