マテリアルの基本概念

Unreal Engine におけるマテリアルの入門書です。

Unreal Engine では、マテリアル によってシーン内にあるオブジェクトのサーフェス プロパティを定義します。広義においては、マテリアルを、メッシュの外観を制御するメッシュに適用される「ペイント」と捉えることができます。

具体的には、マテリアルが、シーン内でサーフェスがライトとどのように相互作用するかを Unreal Engine に伝えます。マテリアルでは、色や反射、ラフネス、透明度などを含む、サーフェスのあらゆる側面を定義します。

シェーディング パイプラインの概要

シェーダーは、レンダリング パイプラインにおいて、各頂点または各ピクセルをどのようにレンダリングするかを定義するプログラムです。Unreal Engine では、シェーダーを ハイレベル シェーディング言語 (HLSL) で記述します。シェーダーのコードは、GPU ハードウェアで実行可能なアセンブリ言語命令のリストに変換されます。このようにして、最終的なピクセル カラーがディスプレイに出力されます。

Unreal Editor では、プロジェクトで使用するシェーダーを HLSL コードで記述する必要はありません。代わりに、マテリアル エディタ と呼ばれるビジュアル スクリプティング インターフェース内で、マテリアル と呼ばれるアセットを作成します。

マテリアル

マテリアルは、シェーダー グラフ内で マテリアル式 と呼ばれるノードを複数組み合わせて、それぞれの結果を メイン マテリアル ノード に渡すことで構築します。

Simple walnut floor Material

バックグラウンドでは、これらのノード グラフが自動的に HLSL に変換されます。ユーザーは HLSL コードを表示できますが、コードを直接編集することはできません。これにより、Unreal Engine でのマテリアル作成はより直感的で分かりやすくなっています。

Material graph and HLSL code

マテリアルの HLSL コードは、マテリアル エディタで [Window (ウィンドウ)] > [Shader Code (シェーダー コード)] > [HLSL Code (HLSL コード)] の順に選択することで表示できます。[HLSL Code] タブは、読み取り専用です。HLSL シェーダー コードを Unreal Editor 内で直接編集することはできません。

マテリアル ワークフローの概要

このセクションでは、Unreal Engine におけるマテリアルの作成手順に関する大まかな概要を説明します。

これはステップごとの詳細な手順を示すものではなく、その概念を大まかに示す概要であることに留意してください。マテリアル エディタの使用に関する詳細については、「マテリアル エディタのユーザー ガイド」の各ページを参照してください。

新しいマテリアルを作成する

Unreal Engine では、マテリアルは、スタティックメッシュ、テクスチャ、ブループリントと同様にアセット クラスです。新しいマテリアルはコンテンツ ブラウザから作成できます。

  1. コンテンツ ブラウザ 内で右クリックします。

  2. コンテキスト メニューの [Create Basic Asset (基本アセットを作成)] セクションで [Material (マテリアル)] を選択します。

    Create Material

  3. コンテンツ ブラウザ内にマテリアルが作成されます。このマテリアルに固有のわかりやすい名前を付けます。

    Material thumbnail

マテリアルの編集を開始するには、マテリアル アセットを ダブルクリック します。下図のように、マテリアル エディタ のウィンドウが開きます。

画像をクリックすると拡大表示されます。

強調表示されている領域が マテリアル グラフ であり、マテリアルの作成に関するほとんどの作業はここで行います。新しいマテリアルのマテリアル グラフには、メイン マテリアル ノード のみが存在し、このノードにはマテリアルの外観と動作を決定づけるすべての入力が含まれています。

マテリアル エディタの UI の詳細については、こちらを参照してください

マテリアルのプロパティ

メイン マテリアル ノード が選択されていると、グローバルなマテリアルのプロパティと設定が [Details (詳細)] パネル に表示されます。マテリアル グラフの空白の領域をクリックすることで、マテリアルのプロパティを表示することもできます。

次の図で示されている 3 つの設定はマテリアルの基礎を形成し、それをどのように使用できるかを決定づけるものであるため、マテリアル作成の初期段階で特に重要です。

Detail properties

  • Material Domain (マテリアル ドメイン) – プロジェクトでのマテリアルの使用目的を定義します。たとえば、サーフェス、ユーザー インターフェース、ポストプロセス マテリアルはそれぞれ異なるマテリアル ドメインです。

  • Blend Mode (ブレンド モード) – マテリアルがその背後にあるピクセルとどのようにブレンドされるかを定義します。たとえば、[Opaque (不透明)] のシェーダーではその背後のオブジェクトが完全にオクルードされ、[Translucent (透過)] および [Additive (加算)] のシェーダーでは、バックグラウンドとある程度ブレンドされます。

  • Shading Model (シェーディング モデル) – マテリアルがライティングとどのように相互作用するかを定義します。多くの場合、マテリアルでは [Default Lit (デフォルト ライティング)] を使用しますが、Unreal Engine には 髪 (ヘア)クロススキン などの特定の要素向けのシェーディング モデルが用意されており、コンテキスト特有の入力を通じて、これらのタイプのサーフェスを作成しやすくなっています。

これらのプロパティによって、メイン マテリアル ノードでどの入力が有効になるかが決まります。上の図では [Opacity (オパシティ)] がグレーアウトされていますが、これは [Opaque] ブレンド モードでは透過性がサポートされていないためです。

[Translucent (透過)] ブレンド モード を選択すると、[Opacity] 入力が有効になっており、以前のモードでは有効であったいくつかの入力がグレーアウトされています。

Translucent blend mode

新しいマテリアルの作成時には、最初にこれらの 3 つのプロパティを設定することをお勧めします。

[Details] パネルにある他のプロパティの詳細については、「マテリアルのプロパティ」ドキュメントを参照してください。

マテリアル式ノード

マテリアルのプロパティがその基礎だとすると、マテリアル式 はマテリアルの構成要素であると言えます。

Material Expression nodes

それぞれのマテリアル式は、マテリアル グラフ内で特定のアクションを実行します。マテリアル式は、技術的には単に HLSL コードのスニペットのビジュアル表現です。マテリアル式を組み合わせて使用することで、HLSL シェーダーをそのコードを見ることなく作成できます。

あるノードの 出力ピン からドラッグして、別のノードの 入力ピン につなげることで、複数のマテリアル式の間でデータが渡されます。

Connecting Nodes

シンプルなサーフェスであれば、いくつかのマテリアル式だけでマテリアルを定義できます。下の図では、3 つのテクスチャ サンプルでほとんどが設定されています。グラフ内の他のノードは、アーティストがラフネスの強度を微調整するためのものです。

Simple Material

これは完成したマテリアルですが、マテリアル グラフ内で演算やロジックを使ってそのサーフェスをさらに調整することもできます。マテリアル式を組み合わせて、マテリアル内で特定の結果を達成する方法を理解することは、Unreal におけるマテリアル作成の基礎と言えます。

マテリアル式をグラフ内に配置する方法については、こちらを参照してください

Unreal Engine には多数のマテリアル式ノードがあります。そのほとんどにはマウスオーバーによってツールチップが表示されますが、各ノードの使用については、「マテリアル式のリファレンス」ページを参照してください。

マテリアル式のプロパティと値

各マテリアル式には一連のプロパティと値があり、そのノードが選択されているときに [Details] パネル で表示および変更できます。マテリアル グラフにあるノード自体でそれらの値を直接編集できる場合もあります。

マテリアル式のプロパティは、通常は次のようなカテゴリに分類されます。

浮動小数点値

これらの値には、ノードによって格納されているデータ、またはマテリアル式によって実行される操作で使用されるデータが反映されています。以下の例では、Constant マテリアル式で定義されている値、および Math マテリアル式 での算術演算子を示しています。これらの値を設定するには、[Details] パネルを使用するか、そのノード自体のインライン編集を使用するか、そのノードの入力ピンにデータを渡します。

Constant value examples

[Details] パネルまたはインライン編集で設定された値は、そのプロパティと関連付けられている入力ピンにデータが渡されていれば自動的にオーバーライドされます。

Multiply with Constants

  1. 左側にある Multiply ノードは 1 * 2 の演算を行って、値 2 を出力します。

  2. 同じ Multiply ノードに Constant がつながれると、入力 A と入力 B につながれている値が、[Details] パネルでの値よりも優先されるため、このノードは、2 * 3 の演算を行って、値 6 を出力します。

機能のトグル

マテリアル式のプロパティには、ノードの機能を有効または無効にするか、ノードの動作方法を変更するトグルおよびドロップダウン メニューが含まれている場合もあります。たとえば、ViewProperty ノードには、ノードによってどの表示プロパティが出力されるかを選択するドロップダウン セレクタがあります。同様に、ComponentMask ノードには、その出力を通じてどのようなデータを渡すことが許可されるかを決定する一連のトグルがあります。

変数データ

ノードには、そのマテリアル式以外の場所 (ブループリントやコードなど) にあるデータを参照できるようにする変数が含まれている場合があります。そのようなプロパティの例として、パラメータ名、Sort Priority、Custom Primitive Data Index があります。これらの値は通常は、整数またはテキスト文字列です。

値およびプロパティのインライン編集

最もよく使用されるマテリアル式の多くには、マテリアル グラフにあるノード自体で定数値やプロパティを編集する機能が備わっています。そのような式では、ノードを選択して [Details] パネルで値を編集する必要はなく、ノード自体の入力フィールドを使用して値を変更できます。

画像をクリックすると拡大表示されます。

一部のマテリアル式には、デフォルトでは表示されていないインライン プロパティがあります。マテリアル式の下部にあるドロップダウン キャレットをクリックしてノードを展開すると、追加のプロパティが表示されます。

メイン マテリアル ノード

データはマテリアル グラフで左から右に流れ、メイン マテリアル ノード はすべてのマテリアル ネットワークのエンドポイントです。

メイン マテリアル ノードには、マテリアルでどの情報がコンパイルされるかを定義する最終的な入力ピンがあります。グラフ内のマテリアル式は、メイン マテリアル ノードにつながるチェーンの一部である場合以外はマテリアルに影響を及ぼしません。

上のビデオでは、テクスチャ サンプルがメイン マテリアル ノードにある該当する入力につながったときにのみ、マテリアル プレビューが更新されることがわかります。

メイン マテリアル ノードの各入力では、マテリアル全体の特定の性質がそれぞれ定義されています。次の 2 つのページでは、それぞれの入力の使用目的について詳しく説明しています。

  1. 物理ベースのマテリアル」 – Unreal の物理ベースのマテリアルのワークフローに関する原則とベスト プラクティスについて説明しています。

  2. マテリアル入力」 – メイン マテリアル ノードの各入力の動作について説明しています。

コンパイルと適用

マテリアルに対する変更をレベル内に反映させるには、マテリアルをコンパイルする必要があります。マテリアルをコンパイルするには、マテリアル エディタ上部のツールバーにある [Apply (適用)] または [Save (保存)] ボタンをクリックします。

Compile and Apply

コンパイルしたら、コンテンツ ブラウザからレベル内のあらゆるアクタにマテリアルを直接ドラッグできます。

Drag Material onto Actor

通常、コンパイルは数秒で完了しますが、複雑なマテリアルでは数分かかることがあります。マテリアルの開発時やテスト時にこのことがボトルネックになる可能性がありますが、コンパイルによる遅延を最小限に抑える方法がいくつかあります。

マテリアルのインスタンス化 は、イテレーション時間を短縮し、作業時のコンパイルによる長い遅延を回避する一つの方法です。インスタンス化 については以下を参照してください。

マテリアル エディタのユーザー ガイド

ここまでに紹介した手順は、Unreal Engine におけるマテリアルの基本的なワークフローを説明しており、各手順については、マテリアル エディタのユーザー ガイドでより包括的に説明されています。

マテリアルの作成を始める前に、以下に示すそれぞれのページを参照することをお勧めします。

  1. マテリアル エディタのユーザー インターフェース

  2. マテリアル式と関数を配置する

  3. メイン マテリアル ノードを使用する

  4. マテリアルをプレビューして適用する

  5. マテリアル グラフを整理する

ワークフローにおける効率性の概念

作成したマテリアルを 1 度しか使わないことは非常に稀です。同じようなアセットには同じようなマテリアルが必要になることが多いため、プロジェクトのすべてのアクタに対してマテリアルを新しく作成することは非効率的です。

マテリアル インスタンスマテリアル関数 によって、マテリアルのカスタマイズと再利用が容易になり、イテレーションを迅速化し、重複する作業を回避できます。

マテリアル インスタンスとパラメータ化

マテリアル インスタンスを使用すると、単一の親マテリアルから複数のバリエーション、つまりインスタンスを素早く作成できます。

関連性が高いアセットのグループで、基本のマテリアルは同じであるが表面的な特性が異なるアセットが必要である場合に、インスタンスが使用されます。その一例として、いくつかの色のバリエーションがある家具があります。

Chair Material instances

マテリアルのインスタンス化では、まず家具セットの親マテリアルを 1 つ作成し、上の図の椅子のように、それぞれの色のマテリアル インスタンスを作成します。

インスタンスを使用することで、次のようなメリットがあります。

  • 親マテリアルを再コンパイルすることなくマテリアル インスタンスをカスタマイズできる。そのため、インスタンスに加えた変更は、すべてのビューポートですぐに反映されます。

  • マテリアル インスタンス エディタパラメータ をアーティストに公開できる。そのため、アーティストはより複雑なノード グラフを編集することなく、マテリアルのバリエーションを迅速で直感的に作成できます。

詳細については、マテリアル インスタンス のラーニング トラックを参照してください。

マテリアル関数

マテリアル関数 を使用すると、マテリアル グラフの一部を 1 つの再利用アセットにパッケージ化できるようになり、それを共通ライブラリで共有することで、他のマテリアルに簡単に挿入できるようになります。

マテリアル関数の目的は、よく使用されるマテリアル ノードのネットワークに瞬時にアクセスできるようにすることで、マテリアルの作成を効率化することです。

たとえば、下の図にある Blend_Overlay 関数には、図の右側に示されているマテリアル式のネットワーク全体が含まれています。このノードのネットワークを何度も構築する代わりに、この関数を関数ライブラリからグラフに直接挿入できます。

Material Function example

Unreal Editor には、数十個もの事前作成済みマテリアル関数があります。ユーザーはそれらのマテリアル関数を編集して、その動作を変更することも、エディタ内で独自の関数を作成することもできます。

マテリアル関数 の作成と使用については、こちらを参照してください。

色とデータを操作する

Unreal Engine は RGBA カラー モデルを使用しているため、各ピクセルは 赤、緑、青、アルファ の各チャンネルを表す 4 つの値で定義されています。

たとえば、(0.0, 0.0, 1.0, 1.0) という RGBA 値は、純粋な青色で完全に不透明なピクセルを表します。マテリアル エディタでは、このような 4 つの値のセットは float4 と呼ばれます。4 つの 浮動小数点 値が格納されているためです。

マテリアル グラフを通過するすべての情報は浮動小数点数値で表現されますが、常に上記の例のような 4 つの値のセットで値が格納されるわけではありません。マテリアル エディタには次の 4 つのデータ タイプがあります。

データ タイプ

定義

Float

単一の浮動小数点値が格納されます。

(1.0)

Float2

2 つの浮動小数点値が格納されます。

(1.5, 2.0)

Float3

3 つの浮動小数点値が格納されます。

(0.0, 1.0, 3.5)

Float4

4 つの浮動小数点値が格納されます。

(0.5, 1.0, 0.2, 0.9)

マテリアル エディタのノードや入力ピンは、通常は特定のタイプのデータを受け入れるように設計されています。たとえば、チャンネルごとの演算を行うマテリアル式の多くは、その入力に正しいデータ タイプが渡された場合にのみ機能します。

そのため、上記の 4 つのデータ タイプについて理解すること、およびデータを操作し、グラフを通じて情報の流れ方を制御するために使用できる手法と方法を把握しておくことが非常に重要です。Unreal Engine マテリアルの作成方法の入門に続く内容として、次のリンク先の 2 つのページを参照することを強くお勧めします。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル