Unreal Engine のマテリアル インスタンスは、マテリアルのコストが高い再コンパイルせずに、マテリアルの外観を変更するために使用されます。
通常のマテリアルの編集と変更には再コンパイルが必要ですが (ゲームプレイの前の必須事項)、マテリアル インスタンスでは、パラメータ化されたマテリアルを再コンパイルすることなく編集できます。 これにはワークフローにおいて多大なメリットがあるだけでなく、マテリアルのパフォーマンスを向上させることができます。
マテリアル インスタンス エディタで開いているマテリアル インスタンス このインターフェースの [パラメータ グループ] にリストされている属性をカスタマイズできます。
インスタンス化マテリアルの中には、ゲームプレイ中でもインゲーム イベントに反応して変更が可能なものもあります (木のマテリアルが燃えながら黒く焦げていく場合など)。 アーティスティックな要素をきわめて柔軟に視覚的に表現できます。
マテリアルの継承
マテリアルとマテリアル インスタンスの関係は階層的な親子関係です。 マテリアル インスタンスは、親 (すなわちマスター) マテリアルからすべての属性を継承します。 たとえば、以下は、スターター コンテンツの椅子の小道具のマテリアル グラフです。
M_Chair から作成されたすべてのマテリアル インスタンスは、このグラフからすべての属性を継承します。
上記の命名規則を確認してください。 コンテンツ ブラウザで親マテリアルとマテリアル インスタンスを簡単に識別できるように、この命名規則を使用することをお勧めします。
プレフィックス M_ は、M_Chair のように親マテリアルを示します。
プレフィックス MI_ は、図の右側の 2 つの例のように、マテリアル インスタンスを示します。
新規に作成されたマテリアル インスタンスは、親マテリアルの属性を継承しているため、レベルでオブジェクトに適用されると、親マテリアルとまったく同じように表示されます。 次の画像では、左端の椅子には親マテリアルが適用されており、中央と右の椅子には変更されていないマテリアル インスタンスが使用されています。
マテリアル インスタンスのワークフローにおける主なメリットは、ノード グラフを編集したり、マテリアルを再コンパイルしたりせずに、非常に迅速に マテリアル インスタンス エディタをカスタマイズできることです。
次のビデオでは、2 つのマテリアル インスタンスをコンテンツ ブラウザで開き、マテリアル インスタンス エディタで編集しています。 標準的なマテリアルでは、複雑さによっては再コンパイルに 1 分近くかかることもありますが、変更はメイン ビューポートにすぐに表示されます。
マテリアルのパラメータ化
まず、把握しておくべきことは、デフォルトではマテリアル インスタンスのすべての特性を編集できないということです。 マテリアルの属性をインスタンス内で編集可能にするには、親マテリアルのパラメータとして指定する必要があります。 これは、マテリアルのパラメータ化と呼ばれています。
パラメータはマテリアル エディタのその他のデータ ノードと同様に作成され、パラメータ化されていないものと同じ情報が格納されています。
たとえば、定数式には浮動小数値が 1 つ含まれており、Roughness や Metallic などのマテリアル入力の制御によく使用されます。 このノードのパラメータ化されたバージョンは、スカラー パラメータと呼ばれています。
定数マテリアル式 (1) およびスカラー パラメータ (2)。
なお、スカラー パラメータは名前付きの値にもなります。この場合は、マテリアル インスタンスにデータ値を送るためのコンジットとして機能します。 重要なのは、[詳細] パネルですべてのパラメータに一意でわかりやすい名前をで付けることです。 マテリアル グラフでノードを選択し、[詳細] パネルでそのプロパティを表示します。
この例では、パラメータ名は Roughness で、デフォルト値は 0.25 です。
次の図のシンプルなパラメータ化されたマテリアルでは、 Vector Parameter が Base Color 入力に接続され、 Scalar Parameters が Metallic と Roughness に接続されています。
パラメータ化の考え方をさらに詳しく示すために、Specular 入力には 0.5 の定数値も渡されています。
マテリアル インスタンス エディタで開くと、これら 3 つのパラメータは公開されているため編集可能ですが、定数は公開されておらず、編集することもできません。 アーティストに公開したい値はパラメータ化し、ユーザーによる変更を避けたい値は定数のままにします。
Base Color、Metallic、および Roughness のパラメータは、マテリアル インスタンス エディタで編集可能ですが、定数の値はアーティストに公開されません。
パラメータのタイプ
パラメータは、マテリアル グラフ内の任意の箇所で使用して、幅広いマテリアル エフェクトを制御することができます。
次に、主なパラメータの型について説明します。また、パラメータ式の詳細なリストについては、こちらをご覧ください。
スカラーパラメータ
ScalarParameter は、単一の浮動小数値を含むパラメータです。 スカラー パラメータは、前述の Roughness や Metallic の例のように、単一の値に基づいてあらゆるエフェクトを制御することができます。
スカラー パラメータは、属性の乗算係数を制御するためにもよく使用されます。
このグラフでは、スカラー パラメータとソリッド カラーを乗算して、その結果を Emissive Color 入力に渡しています。 スカラー パラメータの値は、エミッシブ エフェクトの強度を制御します。 値が大きいほど、エミッションの明るさが増します。
ベクターパラメータ
VectorParameter は、4 チャンネルのベクター値、すなわち 4 つの浮動小数値を含むパラメータです。
ベクター パラメータは、通常、設定可能な色の指定に使用されます。ただし、位置データを表したり、複数の値を必要とするエフェクトを制御したりするためにも使用します。
テクスチャパラメータ
最も一般的に使用されるテクスチャ パラメータは TextureSampleParameter2D です。テクスチャ パラメータを使用すると、マテリアル インスタンス内のテクスチャを変更することができます。
テクスチャ パラメータには、ほかにも使用可能なタイプが複数あります。 これらのタイプは、受け取るテクスチャのタイプや使用方法がそれぞれ特定されています。 たとえば、次のようになります。
TextureSampleParameterCube は TextureCube またはキューブマップを受け取ります。
TextureSampleParameterFlipbook は FlipbookTexture を受け取ります。
TextureSampleParameterMeshSubUV は、メッシュ エミッタとともに SUB-UV エフェクトに使用される Texture2D を受け取ります。
TextureSampleParameterMeshSubUV は、メッシュ エミッタとともに SUB-UV のブレンド エフェクトに使用される Texture2D を受け取ります。
テクスチャ パラメータの詳細なリストについては、「マテリアル式リファレンス」を参照してください。
静的パラメータ
スタティック パラメータはコンパイル時に適用されるため、マテリアル インスタンス エディタでは編集可能であるものの、スクリプトや実行時には編集できません。
このパラメータは、マテリアルのブランチをマスクするために使用できます。 たとえば、StaticSwitch パラメータは 2 つの入力を受け取ります。 パラメータの値が true の場合は最初の値を出力し、false の場合は 2 番目の値を出力します。 これにより、スタティック パラメータでマスクされたブランチがランタイム時に実行されないため、より最適なコードが生成されます。
具体的なスタティック パラメータの種類の詳細については、「スタティック スイッチ パラメータ」および「スタティック コンポーネント マスク パラメータ」を参照してください。
インスタンスで使用されるベース マテリアルのスタティック パラメータのすべての組み合わせで、新しいマテリアルがコンパイルされます。
これにより、コンパイルする必要のあるシェーダーの数が過剰になる可能性があります。 そのため、マテリアルのスタティック パラメータの数と、実際に使用されるスタティック パラメータの順列数を最小限に抑えるようにしてください。
定数インスタンスおよびダイナミック インスタンス
Unreal Engine では、次の 2 種類のマテリアル インスタンスを利用できます。
マテリアル インスタンス定数 — 実行前にのみ計算されます。
マテリアル インスタンス ダイナミック — 実行時の計算 (および編集) が可能です。
マテリアルインスタンス定数
マテリアル インスタンス定数は、実行前に 1 回のみ計算するインスタンス化マテリアルです。 つまり、ゲームプレイ中での変更はできません。 ただし、ゲーム中はずっと一定のまま保持されますが、コンパイルが不要というパフォーマンス上のメリットは変わりません。
たとえば、ゲームにさまざまな塗装が施された複数台の車があり、ゲームプレイ中にその色が変わらない場合、最も適切な方法は、汎用的な車の塗装の基本的な要素を表現したマスター マテリアルを作成することです。 次に、車のタイプに応じたバリエーション (色の違い、さまざまなレベルのラフネスなど) を表すマテリアル インスタンス定数を作成します。 この方法は、このページの冒頭で紹介した椅子の例で示されています。
マテリアル インスタンス定数は、コンテンツ ブラウザ内で作成され、マテリアル インスタンス エディタから編集されます。
マテリアルインスタンスダイナミック
マテリアル インスタンス ダイナミック (MID) は、ゲームプレイ中 (実行時) に計算できるインスタンス化マテリアルです。 つまり、プレイ中に、スクリプト (コンパイルされたコードあるいはブループリント ビジュアル スクリプト) を使用してマテリアルのパラメータを変更することで、ゲーム中にマテリアルを変化させることができます。 異なるレベルのダメージを表示したり、建築ビジュアライゼーションで塗装の色を変えたりと、さまざまな領域で MID を応用することができます。
MID はパラメータ化マテリアルまたはマテリアル インスタンス定数のいずれかから、スクリプト内で作成できます。 ブループリントでは、パラメータ化されたプロパティを持つ特定のマテリアルを取得し、Create Dynamic Material Instance ノードでそれを提供します。 そのノードの結果が、Set Material ノードを通じて対象オブジェクトに適用されます。 ゲームプレイ中に変更可能な新規マテリアルが作成されます。
マテリアル インスタンスを作成して使用する
マテリアル インスタンスの作成と使用は、2 つのステップで行われます。 まず、マテリアル インスタンス内でオーバーライド可能にするプロパティのパラメータ表現式を使用する親マテリアルを作成します。 次に、マテリアル インスタンスを作成して、マテリアル インスタンス エディタでプロパティをカスタマイズします。
パラメータ化マテリアルを作成してマテリアル インスタンスで使用する方法については、「マテリアル インスタンスの作成と使用」を参照してください。