【UE5】マテリアルレイヤーの基本的な使い方

プログラマーの尾関です。

今回は複数のマテリアルをレイヤー構造で管理するマテリアルレイヤーの基本的な使い方を説明します。

目次

マテリアルレイヤーの概要

マテリアルレイヤー (Material Layer) とは、複数のマテリアルや関数をレイヤー構造で合成する機能です。

主に、複数のアセットで共通の質感表現を使いたい場合や、動的に切り替わるビジュアルを柔軟に構成したい場合などに利用されます。開発中に複数のビジュアル表現を切り替えて検討する用途にも活用できます。

マテリアルレイヤーを扱うための3つのアセット

マテリアルレイヤーを扱うには主に以下の3種類のアセットを使用します。

  • 通常のマテリアル:レイヤーパラメータに「マテリアルレイヤー」と「マテリアルレイヤーブレンド」を登録する
  • マテリアルレイヤー:Material Attribute を出力する関数型マテリアル。単独では使えず「通常のマテリアル」内で使われてブレンドされます
  • マテリアルレイヤーブレンド:複数のマテリアルレイヤーをブレンドするためのマテリアル

マテリアルレイヤーを使うための大まかな構造としては以下のようになります。

Information

「通常のマテリアル」だけがメッシュに直接割り当てられ、マテリアルレイヤー や マテリアルレイヤーブレンド はあくまで「通常マテリアルの中で使われる部品」でしかありません

マテリアルレイヤーを使うメリット

マテリアルレイヤーを使うためには、やや複雑な手順となりますが以下のメリットがあります。

  • 再利用性の高いマテリアル構造の構築:たとえば「泥レイヤー」「ダメージレイヤー」「水濡れレイヤー」などを定義し、複数のマテリアルで共通利用
  • アセットごとに異なるレイヤー構成を使う:StaticMeshのインスタンスに応じて異なるLayerを割り当て、見た目を変える
  • エディタでのプロトタイピングや比較検討:複数のアート検討用途として切り替えながら見た目の印象を試すなど

注意点

マテリアルレイヤーは柔軟で再利用性の高いマテリアル構造を構築するのに適しています。

ただし、レイヤーを多用したり、ブレンド処理が複雑になると、シェーダー命令数が増加し、特にVRやモバイルなどのGPU性能が限られた環境では描画負荷が高くなるため注意が必要です。

マテリアルレイヤーの作成手順

では実際にマテリアルレイヤーを作成してみます。

マスターマテリアルの作成

まずはマスターマテリアルを作成します。名前はひとます MM_Test としました。

マテリアルの設定は、Blend Mode は “Masked” を選び、 Use Material Attributes を ON にしておきます。

Use Material Attributesについて

「Use Material Attributes」 オプションは、マテリアルエディタで使用される出力方法の切り替え機能です。

これを使うことで、複数の出力ピン(Base Color、Roughness、Normalなど)を直接つなぐ代わりに、構造体(MaterialAttributes)としてまとめて出力できるようになります。

この「Use Material Attributes」を有効にすることで、マテリアルレイヤー (「Material Attribute」を出力するマテリアル) を使用できるようになります。(※マテリアルレイヤーを使う場合は設定必須

Blend Modeについて

マテリアルレイヤーを扱うマテリアルを定義する場合、Blend Modeは、”Opaque” または “Masked” を使うのが一般的です。

マテリアルレイヤーを扱う場合、Blend Mode に Translucent (半透明) を指定すると、描画順などの制御の問題があるため、基本的には使用しないことがおすすめです。

そしてマテリアルエディタで右クリックして「materialattribute」と入力し、MaterialAttributeLayersノードを追加。

これを MM_Testノードに接続することで、マテリアルレイヤーの値を最終的なマテリアルとして出力とすることができます。

マテリアルレイヤーの作成

次にマテリアルレイヤーを作成します。

コンテンツブラウザから「マテリアル > レイヤー > マテリアルレイヤー」で作成します。

アセット名は「ML_A」としておきました。

マテリアルレイヤーインスタンスとは

マテリアルレイヤーの項目の下には「マテリアルレイヤーインスタンス」というものがあります。これはマテリアルレイヤーのパラメータ違いのアセットを作るためのもので、特定のマテリアルレイヤーの機能を共通化したい場合に便利です。

ML_Aを開いて、”MakeMaterialAttributes“ノードを作成して Preview に接続します。

そして Constant3Vectorを作成し、MakeMaterialAttributes ノードに接続し、赤色を設定しておきます。

マテリアルレイヤー2の作成

“ML_A” を複製してマテリアルレイヤーを作成します。名前は “ML_B” としました。

MakeMaterialAttributes“を作成して、Previewに接続。さらに”Constant“ノードを作成して、EmissiveColorに接続し、値は100にしました。

マテリアルレイヤーブレンドの作成

続けてマテリアルレイヤーブレンドを作成します。これはマテリアルレイヤーをブレンドするためのマテリアルです。

名前は “MLB_Blend” にしました。

マテリアルレイヤーブレンドを開くと、ブレンド方法を指定するノードがすでに組まれた状態となっています。

右クリックして「Bounding」と入力して「座標 > BoundingBoxBased_0-1_UVW」を選びます。

BoundingBoxBased_0-1_UVW とは、メッシュのローカルバウンディングボックス(境界ボックス)を基準にして、メッシュ内部の各ポイントの位置を U, V, W の3軸(X, Y, Zに相当)で 0〜1 に正規化して表現するためのテクスチャ座標です。これは、任意のサイズや形状のメッシュに対して一貫したスケーリングやマッピングを行うために利用されます。たとえば W(Z軸方向に対応する)値を Step(0.5, W) のように処理すれば、メッシュの中央高さを境に上下で異なるマテリアル効果や色を適用するマスク処理が可能になります。

ということで Wの値 (RGBなのでB) をStepノードの Yに接続し、StepのXを “0.5” にして、Alphaに接続します。

ただこのままではプレビューができないので、Stepノードを右クリックして「ノードのプレビューを開始」を選びます。

するとプレビューが以下のように表示され、上下で分割できることをわかります。

なおプレビューが有効になっているノードは以下のような表示となります。

続けて、Scaler Parameterノードを作成して名前を「Threshold」とします。そしてStepのXに接続して上下の分割位置をパラメータで調整できるようにします。

マテリアルインスタンスの作成

“MM_Test” を右クリックして「マテリアルインスタンスを作成」を選びます。

名前は “MI_Test” としました。

MI_Testを開いて “レイヤーパラメータ” からマテリアルレイヤーの設定をします。

まずは背景としてレイヤーアセットを “ML_A” に設定します。

次に+ボタンをクリックして、レイヤーを追加します。

新しく追加したレイヤーを以下のように設定します。

  • レイヤーアセット:ML_B
  • ブレンドアセット:MLB_Blend

すると以下のように上下でマテリアルが分割されました。

なお、分割する位置はブレンドアセットでパラメータ化しているので、Thresholdにチェックを入れることでリアルタイムプレビューができます。

マテリアルレイヤーブレンドのパラメータを動的に変更したい場合

マテリアルレイヤーブレンドのパラメータを変更したい場合は、通常のマテリアルと同様に "Material Instance Dynamic (MID)" を生成して動的マテリアルとして処理する必要があります。

ただ注意点として、マテリアルレイヤーブレンドのパラメータを扱う場合は、通常の “Set Scalar[Vector] Parameter Value” では変更できないようで、”Set Scalar[Vector] Parameter Value By Info” を使う必要があります。

値を取得するときも "By Info" のノードを使う必要があります。

半日ほど「マテリアルレイヤーブレンドのパラメータが変更できない…」と悩んでいたのですが、以下のページにこの情報がありました。

マテリアルレイヤーの動的な入れ替えはできない

マテリアルレイヤーブレンドは、ゲーム実行中に動的に自由にレイヤーの入れ替えができるものではなく、指定したレイヤーとブレンドの組み合わせものを静的なシェーダーとして自動生成するだけです。そのためマテリアルレイヤーの組み合わせが何十パターンもある場合には、マテリアルレイヤーを使うのはおすすめしません。

例えばブレンド元のマテリアルが "10パターン" あり、ブレンド先のマテリアルが "10パターン" あると、9x9=81パターンのレイヤーブレンドを作る必要があり、膨大な手間がかかります。

そのため、もし複数のマテリアルを動的に入れ替えてブレンドしたい場合は、1つのマテリアルにパラメータを集約して weight 値でブレンドする…といった実装になるような気がします。

参考

この記事を書くにあたって以下の動画を参考にさせていただきました。ありがとうございます。

\ 最新情報をチェック /