今回の検証は、ローポリからテクスチャベースで立体形状をどこまで再現できるか、というものす。
■前知識の確認
ところで、ゲームエンジン、リアルタイムレンダリング向けに、バンプ技術があるのをご存知でしょうか。
(TessellationやPOM(ParallaxOclusionMapping)について知っている方は、釈迦に説法となってしまいますので、この項目を飛ばしていただければ幸いです。)
ゲームCGではノーマルマップが有名ですが、DirectX11やOpenCN3からTeessellation(テッセレーション)というリアルタイムのディスプレイスメント機能や、POMという視差マッピング、バンプオフセット機能が使えるようになりました。
プリレンダのディスプレイスメントマップとTessellationの一番の違いは、メッシュの分割方法にあります。
プリレンダの場合、四角ポリゴンを4倍にする四分割法が使われますが、テッセレーションでは三角メッシュを増やす方法が取られます。
分割を前提とする場合、ゲーム用のモデルとプリレンダ用のモデルでは作り分ける必要があります。
リアルタイム用のモデル製作には様々なポイントがありますが、ゲームモデリングは三角メッシュであり、Mayaの3番表示に用いるようなエッジを詰めたトポロジは良くない結果をもたらすということです。
■検証
①ここに、3DCoatで作成したキューブにブーリアンしたライトセーバー二本とスプリング形状があります。
②ベイク用の板ポリを作成し、ライトセーバーとスプリングのハイトマップを計算します。ノーマルマップの焼き方と同じです。
③ハイトマップを適応表示してペイントできる3Dペイントソフトは現状ありませんが、3DCoatではハイトマップをベイクするとこのような表示になります。
ちなみに、SubstanceではHightをベイクしたりペイントしてもビュー上では何も表示されなかったりします。Designerの方では対応していますが、Painterの方でも早く対応してほしいです。
④PBR用にカラー、ラフネス、メタルネスをペイントしていきます。ノーマルマップも出ているので、元の凹凸形状に基づいたペイントが可能です。
テストなので、かなり適当なペイントで申し訳ありませんが、色々意味がございます。
ノーマルのみ、バンプのみ部分、金属質感、実は左上に透明部分を持たせてあります。
これらがTessellationでどのように再現できるのか知る必要があったためです。
⑤今回はUE4でマテリアルシェーダーを組んでいきます。
Tessellationはワールドスペースを参照しているため、VecterNormalWSノードを乗算したHigntMapをワールドディスプレイスメントOutPutに接続してやる必要があります。
テッセレーション乗数では分割の細かさを指定するため、コンスタントノードを接続してパラメータ化しておくと便利です。
⑥テッセレーションの分割数を指定し、オフセットを調節します。
このような感じで、ただの板ポリの分割が増え、ハイトマップの白黒に従い立体形状が復活してきました。
⑥ノーマルマップマップで細かいディテールを再現して、完成です。
パッと見、良い感じに復元されたのではないでしょうか。
質感、Tranceparency(透明部分)等も再現できております。
⑦ハイトマップの弱点
ハイトマップの弱点は、ずばり、真上にしかオフセットできないことです。なので、トンネル形状や、下向き凸形状が再現しきれません。
また、三角分割なので、分割が現実的な値だとどうしてもギザギザになる部分が出てきます。横からじっくり見られると厳しい部分があるかもしれません。
⑧これからの展望
グレースケールのHightマップの弱点を克服するために、ベクターディスプレイスメントという技術があります。
真上に押し出すだけの白黒Hightマップだけではできない、複雑なオフセットを可能にするため、カラーチャンネルを用いたディスプレイスメントマップです。
今のところ、MadBoxやZBrushで生成できますが、ソフトによってもパラメーターが異なるため、今ひとつ実用性はないかもしれません。
UnityAssetsストアで ZBrush出力のベクターディスプレイスメントに対応したシェーダーを発見したの絵、もし興味があれば使ってみるのも良いかもしれません。
https://www.assetstore.unity3d.com/jp/#!/content/15996
平面の板から草花を復元するようなこともできるので、色々使い所はあるのではないでしょうか。ただし、テクスチャも、分割バンプ処理も重いので使い所だとは思います…