Custom 式は、任意量の入力を実行するカスタム HLSL シェーダーコードを書いて、実行結果を出力します。
カスタム式は、マテリアル パレットの [Custom] カテゴリ、またはマテリアル グラフの右クリック検索メニューから挿入することができます。
Custom ノードを選択すると、[Details] パネルから次のプロパティにアクセスできます。
プロパティ | 説明 |
---|---|
Code | 式が実行するシェーダー コードを含みます。(「後述の「警告」を参照してください。) |
Output Type | 式によって出力される値のタイプを指定します。 |
Description | マテリアル エディタの式のタイトルバーに表示するテキストを指定します。 |
Inputs | 式が使用する入力配列です。 |
[REGION:prop_sublist]
Input Name [/REGION] |
[REGION:prop_sublist]
入力の名前を指定します。これは、マテリアル エディタの式に表示される名前であり、入力の値を参照するために HLSL コード内で使用される名前です。 [/REGION] |
Additional Outputs | カスタム式に表示される追加の出力ピンを定義することができます。出力を追加するときは、配列要素を展開し、その Output Name プロパティと Output Type プロパティを指定する必要があります。 |
Additional Defines | カスタム HLSL コードで必要な定義を追加することができます。配列に要素を追加する場合は、 Define Name プロパティと Define Value プロパティを指定する必要があります。 |
Include File Paths | Unreal Engine が既に提供している一般的なシェーダー パス以外のソース ファイルからインクルードするシェーダー コードへのファイル パスを指定します。 |
Custom マテリアル式を使用する
入力配列に必要な数の 入力 を追加し、名前を付けてください。次に Code プロパティ フィールドに HLSL コードをタイプまたはペーストします。例のように return 文で関数全体を入力するか、Input.bgr などの簡単な表現式を使用することもできます。OutputType の出力データ タイプも指定する必要があります。
以下に示す例は、スカラー パラメータの値に基づいてテクスチャ オブジェクトをぼかすことができるカスタム表現式です。
上図で使った以下のコードを使って、自分でカスタム ノードを試すことができます。次のテキストをコピーして、詳細パネルのプロパティの コード フィールドに貼り付けます。
float3 blur = Texture2DSample(Tex, TexSampler, UV);
for (int i = 0; i < r; i++)
{
blur += Texture2DSample(Tex, TexSampler, UV + float2(i * dist, 0));
blur += Texture2DSample(Tex, TexSampler, UV - float2(i * dist, 0));
}
for (int j = 0; j < r; j++)
{
blur += Texture2DSample(Tex, TexSampler, UV + float2(0, j * dist));
blur += Texture2DSample(Tex, TexSampler, UV - float2(0, j * dist));
}
blur /= 2*(2*r)+1;
return blur;
次のビデオは、上記の HLSL コードを使用したカスタム表現式の作成と結果を示しています。
既知の問題
次のセクションでは、カスタム マテリアル式を記述する際に注意すべき一般的な落とし穴をいくつか詳しく説明します。
入力引数はローカル関数
カスタム表現式は別の関数内にラップされているため、常に戻り値があることに注意してください。すべての入力引数 (上記の例の Tex、UV、r、および dist など) は、その外部関数のパラメータとして宣言されるため、可視性のスコープは関数内に限定されます。
デベロッパーは、メンバ関数を含む構造体を作成し、これらのパラメータがその構造体内でアクセスできることを期待することがありますが、関数ローカル パラメーターにアクセスすることはできません。したがって、メンバ関数が Custom 表現式内で使用される場合は、これらのパラメータを手動でコピーする必要があります。
以下はコンパイルに失敗する例です (上記と同じ例を想定)。
struct InnerStruct
{
float4 Run()
{
// ERROR:Tex, TexSampler, and UV is not accessible within InnerStruct
return Texture2DSample(Tex, TexSampler, UV);
}
};
InnerStruct S;
return S.Run();
HLSLcc コンパイラ使用時の構文エラー
古い HLSLcc コンパイラを使用する一部のシェーダー バックエンドでは、ベクトルや行列などの HLSL 型で構文エラーが報告されます。データ型を明示し、それぞれ float4 または float4x4 を使用してください。これらのバグを修正の継続的修正と同時に、新しい DirectXShaderCompiler (DXC) の取り組みを進めています。
警告
- カスタム ノードを使用すると、定数畳み込みが防止され、組み込みノードで行われる同等のバージョンよりもはるかに多くの命令が使用される可能性があります。 定数畳み込みは、必要に応じてシェーダーの命令数を減らすために Unreal Engine が内部で採用する最適化です。例えば、
Sin >Mul by parameter > Add to something
といった一連の表現式は、Unreal Engine では一つのインストラクションに折り畳まれます。表現式 (パラメータ) の全ての入力値が全体のドローコールに対して定数であり、ピクセルによって変更しないためこれが可能となります。Unreal Engine は、カスタム ノードで何も折りたたむことができません。これにより、既存のノードから作成された同等のバージョンよりも効率の悪いシェーダーが生成される可能性があります。そのため、既存のノードでは不可能な機能にアクセスできる場合にのみ、カスタム ノードを使用することをお勧めします。 - カスタム ノードに記述されたシェーダー コードは、有効な HLSL である必要があります。