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