UDN
Search public documentation:

MaterialFunctionsJP
English Translation
中国翻译
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 ホーム > マテリアルとテクスチャ > マテリアル関数

マテリアル関数


_ドキュメントの変更ログ : 作成者 Daniel Wright _

概要

マテリアル関数とは、パッケージの中に保存することができ、複数のマテリアルの中で再利用できるマテリアル図式の小片のことです。 普通のマテリアルと同じように、これらの関数はマテリアルエディタで編集しますが、使用できるノードには制限があります。適切に用いると、不要な重複を避けることができるため、アーティストが重複した表現式の同期を取るというメンテナンス上の作業が減ることになり、重複した片方の表現式が改変中に失われた場合に発生する避けがたいバグも減ることになります。

関数の基本と簡単な設定

関数は、マテリアルとまったく同じようにコンテンツブラウザで作成します。何もない場所を右クリックして、New Material Function (新たなマテリアル関数) を選択します。

関数は、function input (関数の入力) と output (出力) によって、関数が使用されるマテリアルへのインターフェースを定義します。(この input と output は、関数の中に配置するノードです)。input と output には名前を付けて、マテリアルでその関数を使用する人々によってそれらの意味が理解されるようにすることができます。関数が有効になるには、少なくとも 1 個の output が必要です。また、input と output の名前は一意である必要があります。

FunctionNodes.jpg

関数で重要なことは、input と output の間で何を処理するかということです。下の例では、2 つのレイヤーが、 Photoshop のスクリーンブレンド のようにブレンドします。関数を使用すれば、アーティストは詳細を知る必要がなくなるため、スクリーンブレンド処理を使用するために、スクリーンブレンドの計算を実際に知らなくても良いのです。スクリーンブレンド処理の機能を後に変更する場合は、関数に対して変更を加えます。これによって、その変更は、関数を使用するすべてのマテリアルに自動的に反映されます。

ScreenBlendFunction.jpg

関数に対して変更を加えたならば、[Apply] (適用) ボタンをクリックして、その変更を、関数アセットおよびその関数を使用するマテリアルに反映させなければなりません。

マテリアル内で関数を使用するには、関数のアイコンを、コンテンツブラウザからマテリアルの中にドラッグ & ドロップします。あるいは、関数がコンテンツブラウザで選択されている状態で、F キーを押下したままマテリアルエディタ内でクリックします。これによって、作成された関数アセットを参照する MaterialFunctionCall (マテリアル関数呼び出し) ノードが作成されます。次に、ノードを input に接続するとともに、output を、マテリアル内で関数が使用されるべき任意の場所に接続する必要があります。

ScreenBlendInMaterial.jpg

input には、input に接続される表現式に必要とされる特定の型があります。この型は、関数がマテリアル内で使用される際に、input コネクタのとなりに数文字で表示されます。上記例では、両方の input が vector3 なので、V3 と表示されています。マテリアル内で使用される際に input に接続されるものは、この input の型と互換性がなければなりません。

反映

関数を編集し、変更の [Apply] (適用) をクリックすると、ロードされているあらゆるマテリアルとその関数を参照するあらゆる関数に、新しいバージョンが反映されます。この関数を参照するマテリアルがロードされていない場合は、次回ロードされたときに、その変更に関して更新されることになります。

input または output が関数から削除され、その変更が反映されると、この関数を使用するマテリアル内において、これらの削除されたコネクタへのあらゆるリンクが破壊されます。 この反映はやり直しがきかないため、このことに注意すべきです。関数が使用されるマテリアルが増えれば、その分だけリンクが破壊される可能性が高くなります。注意してください。

関数を使用するすべてのロード済みマテリアルは、関数の変更が伝えられた際、ダーティとしてマークされます。これは、どのパッケージを再保存するかを判断するために使用され、ロード時間の増加を防ぎます。関数を使用するロード済みマテリアルをすべて調べるには、コンテンツブラウザ内で右クリックして、次のオプションを選択します。

FindUsingMaterials.jpg

整理

関数は、少数の人が作成して、多数の人によって使用されるのが普通です。したがって、関数が実行する内容、および iput、output に必要となる値についてドキュメント化することが大切なこととなります。このような理由により、関数には、関数名と input、output 名以外に、ドキュメンテーション入力フィールドがいくつかあります。

  • Function description (関数の説明) - 空いているところをクリックして、関数のプロパティ (Description (説明) が置かれています) を表示します。 1 つの description フィールドだけに入力する場合は、これにしてください! 入力された内容は、関数が表示される場所であればどこでも (コンテンツブラウザ、マテリアル関数ライブラリ、関数呼び出しノード)、ツールチップとして表示されることになります。
  • Input / output descriptions (入力 / 出力の解説) - これらは、関数の input および output 上に位置しています。これらは、関数呼び出しノードの input および output 上にカーソルを乗せると、ツールチップとして表示されることになります。

次は、入力された Function Description (関数の説明) フィールドです。

FunctionProperties2.jpg

次は、マテリアル内で使用されるツールチップです。上記フィールドに対応しています。

FunctionTooltip.jpg

Material function library (マテリアル関数ライブラリ)

マテリアルエディタには、Material function library (マテリアル関数ライブラリ) というウインドウがあります。このウインドウには、使用可能なマテリアル関数のリストが、分類されフィルタリング可能な状態で含まれています。このリストには、ロード済みのあらゆる関数がエントリされます。さらに、ロードされていないものの、コンテンツブラウザによって使用されている コンテンツブラウザデータベース を通じて発見された関数もエントリされます。

MaterialFunctionLibrary.jpg

これらのエントリにカーソルを乗せると、その Description がツールチップとして表示されます。あるいは、マテリアルの中にドラッグ & ドロップすることができます。関数が関数ライブラリの中に表示されるようにするには、関数のプロパティの中で bExposeToLibary の値がチェックされる必要があります。

FunctionProperties.jpg

意味のあるライブラリカテゴリを指定するようにしてください。新たなカテゴリを作成せずに、既存のものを再利用すべきです。

プレビュー

マテリアル関数を編集しているとき、プレビューウインドウには、どのノードがプレビューされているかが示されます。ほとんどの場合、function output をプレビューしなければならないはずです。

PreviewingOutput.jpg

function input ノードには、プレビューの値を指定するためのオプションがあります。マテリアル内で使用されるときに用いられる実際の値が、ノードには分からないためです。各 input には、元々 PreviewValue が備わっており、float 型の input タイプのための定数を示すために使用することができます。また、function input には、Preview (プレビュー) コネクタがあり、もともと備え付けられている値を、その input のタイプに合う値でオーバーライドすることができます。次の例では、texture sample (テクスチャサンプル) が使用されて、vector 3 型 input のために preview が供給されています。

PreviewTexture.jpg

次の例では、Static Bool (静的 bool) ノードが使用されて、static bool 型 input のためにデフォルトの値が供給されています。

PreviewStaticBool.jpg

なお、input には、Use Preview Value As Default (デフォルト値として preview 値を使用する) というオプションがあります。このオプションが有効になっていれば、関数がマテリアル内で使用され、なおかつその input に何も接続されていない場合はいつでも、この preview 値が使用されることになります。コンパイルエラーは起こしません。これによって、input はオプションの input となります。そのため、灰色となります。

パラメータ

関数は、パラメータノードのタイプを含むことができません。これは、同じ名前を宣言している他の関数との間で名前コンフリクトを起こす可能性があるからです。ただし、input を通じて値を渡すことによって、パラメータを使用することができます。関数とともにベクターまたはスカラーのパラメータ値を使用するには、その値を関数の input ベクター型として渡します。

関数とともにテクスチャパラメータを使用するには、下図のように、Texture の input を作成して、それを、Texture Sample ノードにあるテクスチャオブジェクトのオーバーライドに接続します。

TextureParameterFunction.jpg

さらに、下図のように、その関数を使用するマテリアル内に、TextureObjectParameter ノードを配置し、それを Texture の input に接続します。

TextureParameterMaterial.jpg

同様に、静的な スイッチパラメータについては、下図のように、static bool の input を作成し、それを StaticSwitch ノードに接続します。

StaticSwitchFunction.jpg

さらに、その関数を使用するマテリアル内に、StaticBoolParameter ノードを配置し、それを static bool input に接続します。

StaticSwitchMaterial.jpg

関数関連のノード

  • MaterialFunctionCall (マテリアル関数呼び出し) - 他のマテリアルまたは他の関数からの外部関数を使用できるようになります。外部関数の input および output ノードは、関数呼び出しノードの input および output になります。
  • FunctionInput (関数 input) - 関数の input の 1 つを定義するマテリアル関数内にのみ、配置することができます。
  • FunctionOutput (関数 output) - 関数の output の 1 つを定義するマテリアル関数内にのみ、配置することができます。
  • TextureObject (テクスチャオブジェクト) - 関数内部のテクスチャ関数 input のためにデフォルトのテクスチャを供給するのに役立ちます。このノードは、実際にテクスチャをサンプリングするわけではありません。したがって、TextureSample ノードとともに使用する必要があります。
  • TextureObjectParameter (テクスチャオブジェクトパラメータ) - テクスチャパラメータを定義するとともに、テクスチャオブジェクトを output します (これはテクスチャ input をもつ関数を呼び出すマテリアル内で使用されるものです)。このノードは、実際にテクスチャをサンプリングするわけではありません。したがって、TextureSample ノードとともに使用する必要があります。
  • StaticSwitch (静的なスイッチ) - input の値に基づき、2 つの input からコンパイル時間の選択を行います。
  • StaticBool (静的な bool) - 関数内にある static bool 関数 input のために、デフォルトの bool 値を供給するのに役立ちます。このノードは、何もスイッチしません。そのため、StaticSwitch ノードとともに使用する必要があります。
  • StaticBoolParameter (静的な bool パラメータ) - static bool パラメータを定義し、static bool 値を output します (これはstatic bool input をもつ関数を呼び出すマテリアル内で使用されるものです)。このノードは、何もスイッチしません。そのため、StaticSwitch ノードとともに使用する必要があります。

高度な使用

関数はネスティング (関数の内部に関数を置くこと) させ、自由につなげることが可能です。ただし、循環依存関係とならないようにしなければいけません。

関数内でコンパイルエラーが起きると、関数を使用するマテリアル内で、MaterialFunctionCall (マテリアル関数呼び出し) ノードが赤く強調表示されます。エラーメッセージには、どの関数でエラーが発生したかについても表示されます。次の例では、関数の input が接続されていないというエラーが起きています。

CompileErrors0.jpg

関数の input が接続されましたが、エラーメッセージによると、関数内部にある Add (加算) ノードにエラーがあるとのことです。

CompileErrors1.jpg

関数をダブルクリックして、そのためのエディタを開きます。エディタでは、Add ノードがエラーのため赤く強調表示されています。

CompileErrors2.jpg