
マテリアル関数 は、パッケージに保存ができて、多数のマテリアルで再利用できるマテリアルグラフの小規模なスニペットです。マテリアル関数の目的は、マテリアル ノードで一般に使用するネットワークへ瞬時のアクセスを可能にすることにより、マテリアルの作成過程を簡素化することです。例えば、雑然としたテクスチャのパンのみを処理するために頻繁にネットワークを作成しているユーザーは、ネットワークのその部分をマテリアル関数として保存し、このような動作が必要な時に使用することで作業を加速することができます。
関数は通常のマテリアルのようにマテリアル エディタで編集しますが、使用可能なノードに一部制限があります。正しく使用した場合、マテリアルの冗長性を削減することで、重複した表現式の同期作業に費やすアーティストのメンテナンス作業時間も削減します。また、修正時にある複写を忘れることで発生する不可避なバグも削減することができます。
マテリアル関数もまた コンテンツ ブラウザ に表示されるアセットです。マテリアル関数のグラフはマテリアルのグラフとは異なります。マテリアル関数は、主なマテリアルノードの代わりに最後の関数の出力接続を示す、出力ノードを表示します。
マテリアル関数を、電子機器プロジェクトの筐体と考えると理解しやすいかもしれません。必要な限りの入力と出力を追加することができます。マテリアル関数の核心は、これらの入出力値間でどのような処理が行われるかということです。この例は 2 つのレイヤーを取り上げて、これらを Photoshop のスクリーン ブレンド のようにブレンドします。関数は、ユーザーが使用する部分の詳細を抽象化するため、実際のスクリーン ブレンド操作に使用するスクリーン ブレンドの演算を理解する必要はありません。スクリーン ブレンド操作方法を後に変更したい場合、変更を関数に加えて処理すると、このブレンドを使用する全てのマテリアルに自動的に継承されます。

上記のとおり、入力および出力間に起こる動作は全てユーザーに一任されて、標準のマテリアル式ノードのネットワークによって定義されます。しかし一度マテリアル関数をマテリアルに配備すると、入力値および出力値と共に関数のノードのみが見えるようになります。

マテリアル関数ライブラリ
マテリアル関数の終了時は、マテリアルの作成中に簡単にアクセスができるように、マテリアル関数ライブラリへ発行されなくてはいけません。マテリアル関数ライブラリはマテリアルエディタにあるウィンドウで、利用可能なマテリアル関数の分類およびフィルタ別のリストを収容します。このリストはロードされた関数からエントリされますが、アンロードの、コンテンツ ブラウザで使用するコンテンツブラウザ データベース経由で見つかる関数からもエントリされます。

ツールヒントの説明を確認するためにエントリ上にカーソルをかざしたり、マテリアルへエントリをドラッグ&ドロップ操作することも出来ます。
マテリアル関数をマテリアル関数ライブラリに表示するには、 Expose To Library プロパティに必ずチェックを入れなくてはいけません。関数内部では、関数自体のベースプロパティを表示する全ノードの選択を解除します。
マテリアル関数ライブラリ内にデフォルトで存在する関数の一覧表は、マテリアル関数のリファレンス を参照してください。
関数関連のノード
以下にマテリアル関数に関連するマテリアル式ノードとその目的を示します。
- MaterialFunctionCall - 別のマテリアルまたは関数から外部関数の使用を有効にします。外部関数の入出力ノードは関数呼び出しノードの入出力になります。
- FunctionInput - 関数入力の 1 つを定義するマテリアル関数のみに配置することができます。
- FunctionOutput - 関数出力の 1 つを定義するマテリアル関数のみに配置することができます。
- TextureObject - 関数内のテクスチャ関数入力のデフォルトテクスチャの使用に実用的です。このノードはテクスチャを実際にサンプル化しないので、TextureSample ノードを併用しなくてはいけません。
- TextureObjectParameter - テクスチャ パラメータを定義して、テクスチャ入力と一緒に関数を呼ぶマテリアルに使用するテクスチャ オブジェクトを出力します。 このノードはテクスチャを実際にサンプル化しないので、TextureSample ノードを併用しなくてはいけません。
- StaticSwitch - 入力値に基づいて、2 つの入力間でコンパイル時間の選択を実行します。
- StaticBool - 関数内のスタティック bool 関数入力のデフォルトの bool 値の提供に役立ちます。このノードは切り替えをしないため、StaticSwitch ノードを併用しなくてはいけません。
- StaticBoolParameter - スタティック bool パラメータを定義して、スタティックbool値を出力します。スタティック bool 入力と共に関数を呼び出すマテリアルに使用します。このノードは切り替えをしないため、StaticSwitch ノードを併用しなくてはいけません。
入力値と出力値
マテリアル関数はノードのネットワークにカプセル化されているため、フローの入出力データの確認はユーザーの責任となります。FunctionInput と FunctionOutput ノードを利用して処理します。これらのノードに対する理解力は、マテリアル関数を使用する上で重要です。
関数内部では、FunctionInput と FunctionOutput が以下のように表示されます。

しかし外部からは、関数がマテリアル内で使用されると、これらノードは入力および出力ピンの役割をします。

FunctionInput ノード
前述のとおり、Material Input ノードはデータがマテリアル関数へ入力される際にゲートウェイの役割をします。既定の関数はこのような入力ノードをいくつも持つことができます。各ノードは関数に表示される入力ピンに対応します。

以下のようなプロパティおよびデータピンがあります。
アイテム | 説明 |
---|---|
プロパティ | |
Input Name | 外部関数から見える入力の名前を提供します。 |
Description | ユーザーが関数の入力ピンにカーソルをかざすと表示される入力の説明を提供します。 |
Input Type | 期待するデータのタイプを入力に伝えます。以下の 入力タイプ を参照してください。 |
Preview Value | テストや構築過程中に関数の視覚化を助ける方法として機能します。ここで入力される値はすべて外部関数からの入力を通じて送信されたかのように使用されます。 |
Use Preview Value as Default | プレビュー値に設定されたデータをデフォルト値としての使用を有効にするチェックボックスです。この値に対し、関数の入力値の提供をユーザーに強制させたくない場合に実用的です。 |
Sort Priority | 入力ピンが関数のノードにリストされる順番制御に使用する数値です。順番は低い値から高い値となります。 |
入力ピン | |
Preview | この入力値は、[Preview Value] プロパティに優先する値を受け取ります。関連プロパティ同様に、コンストラクションやデフォルト値の設定時の関数のテストに実用的です。 |
出力ピン | |
(Unlabled) | 関数に処理される入力データの出力を提供します。 |
FunctionOutput ノード
FunctionOutput ノードは、マテリアルでデータをさらに活用するために、処理されたデータが final 関数を終了させます。FunctionInput ノード同様に、関数には潜在的な出力をたくさんもたらすノードがいくつもあるかもしれません。

FunctionOutput ノードには以下のプロパティがあります。
アイテム | 説明 |
---|---|
プロパティ | |
Output Name | 関数外部から見える出力の名前を提供します。 |
Description | ユーザーが関数の出力ピンにカーソルをかざすと表示される入力の説明を提供します。 |
Sort Priority | 入力ピンが関数のノードにリストされる順番制御に使用する数値です。順番は低い値から高い値となります。 |
入力ピン | |
(Unlabeled) | 関数に処理されたデータの入力値を提供します。このデータはマテリアルで使用するために、関数から送信されます。 |
入力タイプ
入力には接続している表現式が必要とする指定タイプがあります。FunctionInput ノードの Input Type プロパティ経由で設定します。関数の外部からは、このタイプはマテリアルで関数の使用時に入力コネクタの数文字横に表示されます。この場合、入力値は両方とも vector3 からの入力値であるため、V3 が表示されます。マテリアルで使用時に入力と接続しているものは全て入力タイプに変換可能でなくては いけません。そうでない場合はエラーを受け取ります。

以下に利用可能な入力タイプと関連の略語を示します。
入力タイプ | 略語 |
---|---|
Scalar | S |
Vector2 | V2 |
Vector3 | V3 |
Vector4 | V4 |
Texture2D | T2D |
TextureCube | TCube |
StaticBool | B |
共通プロパティ
関数をデザイン中に全ての選択ノードを解除すると、関数自体にベースプロパティを利用することができます。
アイテム | 説明 |
---|---|
プロパティ | |
Description | ユーザーが関数リスト内の関数、またはマテリアルエディタ内の関数ノードのボディにカーソルを乗せた時にツールヒントとして表示される説明です。 |
Expose to Library | ボックスがチェックされると、マテリアルエディタ内のマテリアル関数リストにマテリアル関数が表示されて、マテリアル内部で使用することができます。新しい関数を表示するために、エディタの再起動が必要かもしれません。 |
Library Categories | この配列には [Material Function] タブの全カテゴリが保持されます。タブにはこの関数が表示されます。 |
プレビュー
マテリアル関数の編集時は、プレビュー中のノードがプレビューウィンドウに表示されます。いずれかのノードを 右クリック して、その時点までのネットワークの結果をプレビューするために、 Start Previewing ノード を選択します。

大抵は関数出力のプレビューが目的なため、これらがデフォルトでプレビューされます。

ノードはマテリアル内で使用する実際の値を知らないため、関数入力ノードにはプレビュー値を指定するオプションがあります。それぞれの入力値には内蔵の プレビュー値 があり、浮動小数入力型の定数を表示するために使用できます。関数入力値にある「Preview」コネクタは、入力タイプが一致する値で内蔵のプレビュー値のオーバーライドを有効にします。例では、float3 入力のプレビューを表示するためにテクスチャ サンプルを使用しています。

この例は、スタティック Bool 入力のデフォルト値の提供に Static Bool ノードを使用しています。

入力には「Use Preview Value As Default」という名称のオプションがあることに留意してください。このオプションが有効になると、マテリアルで関数を使用すると常にプレビュー値を使用して、コンパイルエラーを引き起こす代わりにこの入力には何も接続しません。入力を任意入力にするため、グレーで描画されます。
パラメータ
関数にパラメータ ノードのタイプを入れられるようになりました。これらのパラメータは使用するすべてのマテリアルに直接渡せるようになります。
関数と共にテクスチャ パラメータを使用するには、テクスチャ入力を作成して、これをテクスチャ サンプル ノードのテクスチャ オブジェクト オーバーライドと接続します。

そして関数を使用するマテリアルを TextureObjectParameter ノードに配置して、これをテクスチャ入力と接続します。

static switch パラメータ同様に、スタティック bool 入力を作成して StaticSwitch ノードと接続します。

そして関数を使用するマテリアルを TextureObjectParameter ノードに配置して、これをテクスチャ入力と接続します。

構成
関数は、数名が作成して複数人によって使用されことが想定されます。従って関数の役割を示したり、これらに必要な入出力値を示すドキュメントの構成が重要となります。このため関数名と入出力名に加えていくつかのドキュメント欄があります。
-
関数の説明 - 関数のプロパティを見るために [Description (説明)] がある空領域をクリックします。1 つの説明欄のみに記入する場合、この欄を使用します! 関数が表示されているどこかにツールヒントとして表示されます(コンテンツ ブラウザ、マテリアル関数ライブラリ、関数呼び出しノード)。
-
Input / output の説明 - 関数の input および output ノードにあります。関数呼び出しノードの入出力値にカーソルをかざすと、ツールヒントとして表示されます。
関数を記入した Description 欄:

マテリアルで使用時に対応するツールヒント:

伝搬
関数を編集して変更を適用すると、ロードされたマテリアルやこの関数を参照する関数に対して新規バージョンが継承されます。関数を参照するアンロードのマテリアルは、次回ロード時に変更が更新されます。
入力または出力値が関数から削除されて変更が継承されると、関数を使用するマテリアル内の削除されたコネクタへのリンクは壊れてしまいます! 伝搬をやり直すことはできないため、これは大変重要です。関数内でたくさんのマテリアルを使用すればするほど、リンクが壊れる可能性は高くなるので、注意してください。
関数を使用するロードされた全てのマテリアルは、変更が継承されるとダーティとマークされます。ロード時間の増加を抑えるために、再保存するパッケージの確認に使用することができます。関数を使用するロードされた全マテリアルは、コンテンツ ブラウザ を 右クリックして、以下のオプションを選択して検索できます。

関数のネスティング
循環依存関係を絶対に作成してはいけない点を除いて、関数をネスティングして(関数内の関数)これらを任意につなぐことができます。
コンパイル エラー
関数内のコンパイルエラーは、ノードを使用するマテリアルで、赤で MaterialFunctionCall ノードをハイライトします。エラーメッセージにはエラーが発生した関数も表示されます。例として表示するメッセージは、関数の入力が接続されていないことを示しています。

上記のエラー一式は、入力値にプレビュー値を対応させて、各入力値の Use Preview Value as Default プロパティをアクティベートすることによって全て回避することができます。しかしこの慣習は、入力値を未接続のままにしても (エラーメッセージなどで) はっきりと警告してくれないため、もろ刃の剣となる可能性もあります。
関数の入力値が接続されましたが、エラーメッセージによると、関数内の OneMinus ノードにエラーが発生しています。

関数を編集するために、関数を ダブルクリック してエディタを開きます。この時、エラーが原因で OneMinus ノードは赤でハイライトされています。

デフォルトのマテリアル関数
多数のマテリアル関数は既に作成済みで、アンリアル エンジン 4 に同梱されています。関数は パレットパネル を通じて既に利用可能です。
デフォルトのマテリアル関数は、[Engine] > [Functions] フォルダ内の コンテンツ ブラウザ 経由で編集のためアクセスが可能です。
変更がデフォルトのマテリアル関数に保存された場合、この変更は関数の全インスタンスに存在します。これが理由で、変更が必要な場合は、既存関数の独自のコピーの作成が推奨されています。
デフォルトの関数に関する詳細は、マテリアル関数のリファレンスを参照してください。