UE5でのDisplacement(ディスプレイスメント)、Height mapを使ったモデリングのやり方をご紹介します。
レンダリング側でメッシュを細分化して、ディスプレイスメントマップやハイトマップを使用して、凹凸を表現するディスプレイスメントは、特に映像系で使用されるかと思います。
ノーマルやパララックスなどの疑似的な凹凸とは異なり、実際にでこぼこするので、ポリゴン数が増えるというデメリットはありますが、より説得力のあるモデルを簡単に作ることができます。
また、Megascansのサーフェイスマテリアルのテクスチャからディスプレイスメントを適用する方法もご紹介します。
※この記事は、こちらの動画を参考にしています。
UE5.4から使用できるNaniteを使ったディスプレイスメントは、こちらで紹介しています!
UE5でディスプレイスメントを行う
UE4では、マテリアル側にテッセレーションとディスプレイスメントの機能があったのですが、UE5では、それが廃止されました。
しかし、「Geometry Script」というプラグインにディスプレイスメントの機能があります。
Geometry Script プラグイン
Geometry Script プラグインは、デフォルトで無効になっているので、有効にします。
また、UE5.0(Preview)の時点では、Experimental なので、今後、大幅な変更がある可能性もあるので、ご注意ください。
Geometry ScriptはブループリントやPythonでモデリングや既存のメッシュの編集などができる機能です。
頂点やポリゴンの追加や移動、削除、ポリグループの設定、リダクションなどができ、プロシージャルなモデリングを行うことができます。
さすがにHoudiniほどとはいきませんが、色々と面白いことができます。
ディスプレイスメントの仕組みをブループリントで作る
BPでディスプレイスメントができる仕組みを作っていきます。
Content Browserで、ブループリントクラスを作成します。
「GeneratedDynamicMeshActor」を選択します。
ブループリント全体としては、このような感じです。
UEと同じように右クリックでスクロールできます。
内容を説明していきます。
まず、作成した変数は、このような感じです。
全ての変数の「Interface Editable(目のマーク)」を有効にしておいて、レベルで値を変更できるようにしておきます。
まず、Event Graphで、「Event On Rebuild Generated Mesh」を作成します。
最初の「Branch」では、この後の処理を行うか否かを判断しています。
また、「Class Default」から「Reset on Rebuild」のチェックを外しておきます。
メッシュを移動したりするたびに、全ての処理が走ってしまい移動などが大変なので、ディスプレイスメントの設定、調整が済んだ後は、Freezeにチェックを入れることで処理が走らないようにすることができます。
「Copy Mesh form Static Mesh」の「From Static Mesh Asset」にDisplacementを適用したいスタティックメッシュを入力します。
そのスタティックメッシュがこのBP内でDynamic Mesh = Geometry Scriptで色々できる型になります。
ちなみに上のBP全体では、各オプションの☑が外れていますが、☑は入った状態(=デフォルトの設定)で問題ありません。
また、「Source Mesh」変数のGetが少し特殊な形になっていますが、こちらは、Source Mesh変数の中身がある場合は、「Is Valid」に処理が流れ、中身がない場合は、「Is Not Valid」に処理が流れます。
なので、Source Meshにスタティックメッシュがセットされていない場合は、処理がながれないようにして、エラーを防いでいます。
このノードの出し方は、通常通り変数をGetした後に、右クリックから「Convert to Validated Get」で変換することができます。
「Apply PNTessellation」では、メッシュを分割します。
「Tessellation Level」の値が増えるほど、ポリゴン数が増え、滑らかな凹凸にできます。
「Apply Displace form Texture Map」が本題のディスプレイスメントを適用するノードです。「Options Magunitude」は、ディスプレイスメントの強さです。
0では、何も凹凸がでない状態です。
UVベースでDisplacement mapをマッピングするので、「UV Scale」や「UV Offset」などをこちらで設定することもできます。
最後にノーマルを再計算します。
こちらも上のBP全体では、各オプションの☑が外れていますが、☑は入った状態(=デフォルトの設定)にします(上記の画像の設定でOK)。
レベルに作成したブループリントアクターを配置します。
Source Meshに使用したいメッシュをセットし、白黒のDisplancement mapをセットすることで、メッシュを変形させることができます。
「Tessellation Level」は、元のメッシュ分割度合いや求める滑らかさによって異なります。
Megascansのマテリアルのディスプレイスメントマップを使う
Megascansのサーフェイスマテリアルを使用する際は、UE5では、「~_ORDp」というテクスチャのBチャンネルにDisplacement mapが含まれています。
ここまでで、白黒のディスプレイスメントマップを使用することはできるようになりましたが、わざわざBチャンネルを別のテクスチャに抽出するのは、面倒なので、Megascansマテリアルの中の「~_ORDp」からディスプレイスメントマップを拾ってきて、適用する処理を追加したいと思います。
BP全体としては、このような感じです。
「Use Displacement map in Megascns material」の部分が追加したノードです。
処理を追加する場所は、「Apply Displace」の前ならどこでも大丈夫です。
まず、DynamicMeshComponentのマテリアルを取得します。
このコンポーネントのマテリアルをGetすることで、レベル上でセットしたマテリアルを取得することができます。(下記画像の部分でセットできるマテリアル)
マテリアルのパラメーターを取得するために「Cast to Material Instance Constant」を使用します。
「Get Vector Parameter Value」で「Tiling/Offset」パラメーターを取得して、ディスプレイスメントもマテリアルインスタンス側のタイリングとオフセットと一致するようにします。
次に「Get Texture Parameter Value」で「ARD」パラメーターのテクスチャを取得します。
MegascansのSurfaceマテリアルのペアレントマテリアルを見てもらえればわかりますが、「ARD」というパラメーター2Dに「~_ORDp」テクスチャがセットされます。
Texture2DObjectでないと入力できないので「Cast To Texture2D」を使用します。
また、「Apply Displace form Texture Map」の「Options Image Channel」を「2」に設定します。
0:Red チャンネル、1:Green チャンネル、2: Blue チャンネルをディスプレイスで使用します。
「~_ORDp」テクスチャでは、Bチャンネルにディスプレイスメントが格納されているので、2に設定しました。
まとめ
UE5でディスプレイスメントを行う方法を紹介しました。
UE5では、マテリアル側ではなく、Geometry Script = BP or Python側で設定をします。
ただ、現状、Geometry ScriptのDynamic Meshは、Naniteに対応していないようなので、事前にモデリングして、単純にスタティックメッシュでNiniteを使った方がパフォーマンスは良いかと思います。
ただ、どちらにせよ、ディスプレイスメントは、地面や壁などの凹凸を表現するのに使うことが多く、どこもかしこもディスプレイスメントを使うわけではないので、UE5内でディスプレイスメントができるのは、けっこう便利かと思います!
また、だいたいベースカラーやノーマルとディスプレイスメントで全く別の種類のテクスチャを使うことは、あまりないので、紹介したように、マテリアル側からディスプレイスメントマップを取得する仕組みを作っておいた方が便利そうですね。
Geometry Scriptでは、このほかにも色々とできるで、ぜひ触ってみてください!
このサイトでは、UE5の基本的な使い方を解説しています。
ぜひご覧ください!
最後までご覧いただき、ありがとうございました!
コメント