【UE5 R&D】MegascanのSurfaceマテリアルにDisplacement MapとTessellationを適用する

2023/10/14に公開

Displacement Mapを有効にして凸凹を表示する

Quixel Bridgeから追加したMaterial Instanceのパラメータを変更してDisplacement Mapを有効にすると凹凸が表示されるようにします。

MasterMaterialを変更して、追加したMaterialInstanceを簡単にDisplacement MapのON/OFFを変えられるようにします。

プロジェクトを作成する

使用するUnreal Engineのバージョンは「5.3(.1)」です。

実験用のBlankプロジェクトを作成します。

DefaultEngine.iniにTessellationを有効にする設定を追加する

Experimental(実験的機能)なので、プロジェクト設定から設定を変更できません。
「DefaultEngine.ini」をテキストエディタで直接変更します。

[/Script/Engine.UserInterfaceSettings]のカテゴリに以下の設定を追加し、「DefaultEngine.ini」を保存します。
設定はNaniteのTessellationを有効にします。

r.Nanite.AllowTessellation=1
r.Nanite.Tessellation=1

変更した設定はエディタを再起動すると適用されるので、プロジェクトを開きなおします。

MegascanのSufaceマテリアルをプロジェクトに追加する

「Add -> Add Quixel Content」を選択して、「Quixel Bridge」を立ち上げます。
初回立ち上げ時はEpicアカウントでサインインをします。

Surfaceの項目から地面のマテリアルを選択します。
凹凸にメリハリのあるマテリアルを選択します。

選択したマテリアルをダウンロードします。
ダウンロード後に「Add」ボタンをクリックするとプロジェクトに追加されます。

テクスチャとテクスチャを設定したMaterial Instanceが追加されます。
初回「MSPresets」フォルダへMasterMaterialに必要なアセットが追加されます。
今回使用する「Desplacement Map」の情報が含まれている末尾が「_ORDp」になっているテクスチャを開きます。

末尾が「_ORDp」のテクスチャにはRGBにそれぞれ3チャンネル分の情報が含まれています。

  • R : Ambient Occlusion
  • G : Roughness
  • B : Displacement Map(今回使用する)

Displacement Mapは「白(手前)~黒(奥)」で奥行きの情報を持っています。
奥行き情報をマテリアルに適用することで、凹凸情報を疑似的に再現できるようになります。

https://en.wikipedia.org/wiki/Displacement_mapping

https://3dcoat.com/jp/articles/article/displacement-map-in-3dcoat/

Displacement Mapの効果を確認するマテリアルを作成する

Surfaceのテクスチャを各チャンネルに接続します。

Displacement Mapを調整するパラメータを追加します。

BaseMaterialノードのNaniteカテゴリにあるDisplacement Mapに影響するパラメータを変更します。

  • Magnitude : 10.0
  • Center : 0.0

「Apply」をクリックします。

パラメータを調整するためにMaterial Instanceを作成します。

Naniteを有効にしたPlaneに作成したマテリアルを設定する

マテリアルを設定するPlaneのStaticMeshのNaniteを有効にするため、EngineフォルダからContentsフォルダにコピーします。

コピーしたStaticMeshのNaniteを有効にします。

PlaneをVieportに追加します。

PlaneにMaterial Instanceを設定します。

Material Instanceのパラメータを変更してDisplacement Mapを有効にすると凹凸が表示されます。

MagaScanのMasterMaterialをDisplacement Mapの影響を受けるように編集する

Quixel Bridgeから追加した時に作成されたMaterial Instanceを開きます。

Parentに設定されているMaterialがMegascanのMasterMaterialです。
Materialを開きます。

「ARD」というパラメータ名が設定されたTexture Parameterノードに「_ORDp」のテクスチャが設定されます。
Bチャンネルが使用されていないので、Displacement Mapが未使用の状態です。

「MF_MapAdjustments」を変更したいのですが、初回追加時にはEngineフォルダのPluginsフォルダにあるMaterialFunctionなので、Contentsフォルダ配下にある「MF_MapAdjustments」を使用するように変更します。

「MF_MapAdjustments」をDisplacement Mapを受け取れるように編集します。

確認用に作成したマテリアルのDisplacement Mapの処理を複製します。
Function Inputを追加し、画像の内容を設定します。

上下にあるMakeMaterialAttributeノードの「Displacement」に接続します。

「MF_MapAdjustments」の「Apply」をクリックします。

マテリアル側の「ARD」のBチャンネルを「MF_MapAdjustments」の「Displacement」に接続します。

BaseMaterialノードのNaniteカテゴリにあるDisplacement Mapに影響するパラメータを変更します。

  • Magnitude : 10.0
  • Center : 0.0

「Apply」をクリックします。

DisplacementMapが適用されているNaniteを有効に設定してあるPlaneを複製します。
Quixel Bridgeから追加したMaterialInstanceを複製したPlaneに設定します。

MaterialInstanceのDisplacement Mapのパラメータを調整すると凹凸が表示されるようになります。

Quixel Bridgeから新しく追加したSurfaceマテリアルも簡単にDisplacement MapをON/OFFできるようになります。

Displacement Mapの影響を与えるとLightingで凹凸の影が表示されます。

UE4の時はTessellationで頂点数を増やして頂点座標を歪めましたが、
UE5ではNaniteの頂点数は変わらずに凹凸を表示しています。

Tessellationは頂点数を調整してWorld Position Offsetをアニメーションさせて振幅を表現したり別の使い道があったのでUE5でも欲しいので期待していたのですが、少し違った結果になりました。
Experimental(実験的)な機能なので、今後の更新でMasterMaterialの編集は必要なくなりそうです。
期待して正式版を待ちたいと思います。

参照URL

https://en.wikipedia.org/wiki/Displacement_mapping

https://3dcoat.com/jp/articles/article/displacement-map-in-3dcoat/

参考にした動画

https://www.youtube.com/watch?v=1mg8jq6ZIiE

Discussion