プリミティブごとにマテリアルにカスタム データを保存する

Custom Primitive Data ワークフローを使用して、ブループリントからアクセス可能なプリミティブごとにカスタム データを保存する方法の概要について説明します。

Choose your operating system:

Windows

macOS

Linux

マテリアルを使用してカスタム データをインデックス配列に保存します。これにはブループリントとコードからアクセスでき、 Custom Primitive Data (CPD:カスタム プリミティブ データ) ワークフローを使用する際に、シーン プリミティブの変更を反映します。これは Material Instance Dynamics (MID:マテリアル インスタンス ダイナミクス) と同様に機能し、スカラーおよびベクターのパラメータを使用して、ランタイムにマテリアル グラフの一部を動的に制御することができます。この違いは、CPD には、マテリアル インスタンスではなくプリミティブ自体にデータを保存するする利点があることです。これにより、壁、床、他の複製されたジオメトリなど、レベル内に同様に配置したジオメトリの描画呼び出し回数を減らすことができます。

使用方法とワークフロー

カスタム プリミティブ データは、次の方法でシーンのプリミティブに対して機能します。

  1. スカラーとベクターのマテリアル パラメータを設定して、マテリアル ロジックの一部を制御する。動的に設定および制御する各パラメータで [Use Custom Primitive Data (カスタム プリミティブ データを使用)] を有効にします。

  2. このオプションが設定されたパラメータごとに、ブループリントやコードで参照可能な一意の [Primitive Data Index (プリミティブ データ インデックス)] を指定する。

  3. ブループリントの Set Custom Primitive Data ノードを使用して、カスタム データ配列に保存された値にマテリアル パラメータを設定して制御する。

マテリアルの使用方法

マテリアル インスタンスでマテリアルの制御可能な部分 を実行する方法と同様に、 Scalar Vector Parameter の式を使用してマテリアル グラフの一部を制御します。パラメータを選択した状態で [Details (詳細)] パネルを使用して、その式の [Use Custom Primitive Data] を有効にします。

ParameterComparisons.png

左:デフォルトのスカラーとベクター パラメータの式。右は、有効なカスタム プリミティブ データを設定したスカラーとベクトル パラメータ。右:有効なカスタム プリミティブ データを設定したスカラーとベクトル パラメータ。

有効にすると、パラメータにより、配列で割り当てられたインデックスとともに、指定した名前の下に「Custom Primitive Data」と表示されます。

CPD_NodeDisplay.png

[Primitive Data Index] の値には、このパラメータを保存する割り当て済みのインデックスを設定します。このインデックスはブループリントとコードでの参照に使用されます。

スカラー (float) パラメータにインデックスを設定すると、そのインデックスだけを使用します。ベクター パラメータに同様の操作を行うと、4 つあるそれぞれの出力に float 値が設定されます。例えば、ベクター パラメータで [Primitive Data Index] を「0」に設定すると、RGBA 出力ごとのインデックス 0、1、2、3 に float 値が割り当てられます。

ブループリントの使用方法

次のノードを使用して、カスタム プリミティブ データを使用するシーン プリミティブにブループリントを通じてアクセスします。

  • Set Custom Primitive Data Float

  • Set Custom Primitive Data Vector

これらのノードで、パラメータ名と文字列を一致させる必要はありません。その代わりに、割り当てた [Primitive Data Index] を使用して、プリミティブごとに配列のデータを設定および取得します。

CPD_BP_Workflow.png

この配列のカスタム データにマテリアルからアクセスする操作は、マテリアル インスタンスのマテリアル パラメータの操作に似ていますが、パラメータ ノードでは、マテリアルのパラメータが番号付きインデックスではなく、文字列に一致するものである必要があるという点で異なります。

アクタのデフォルトの使用方法

[Details (詳細)] パネルを使用してシーン プリミティブのカスタム プリミティブ データのデフォルト値を設定し、配列要素を [Custom Primitive Data (カスタム プリミティブ データ)] 配列に追加します。

CDP_Defaults.png

それぞれの番号付き配列要素は、対応する値を持つカスタム プリミティブ データ インデックスを参照します。配列要素のインデックスが存在しない場合は無視されます。この方法でデフォルト値を設定することは、ブループリントをアタッチしたり、これを制御するマテリアル インスタンスを作成したりすることなく、値をいくつか手動で調整する場合に最適です。

設定と比較の例

次の例は、いくつかのパラメータ (スカラーとベクターの両方) で実行される単純なマテリアルの使用方法を示しています。ここではベクター パラメータからランダムに色を選択し、グラフのマテリアル ロジックを介してシーンのメッシュにエミッシブとオブジェクト スケールを設定します。ブループリントは、保存したカスタム データに対してこれらのパラメータを実行するために使用します。

マテリアルの設定例

このマテリアル設定では、このマテリアル グラフ内の select パラメータで [Use Custom Primitive Data] が有効になっています。

クリックしてフルサイズ表示。

[Base Color] [Emissive] の強度は、「Color Parameter」と呼ばれる Vector 4 パラメータと、「Emissive Power」と呼ばれるスカラー パラメータの 2 つのパラメータで決まります。

クリックしてフルサイズ表示。

このグラフの下の部分では、ロジックを使用して、レベル内で割り当てられた先のメッシュを均一にスケーリングしています。「Scale_XYZ」 と呼ばれるスカラー パラメータは、割り当てられているオブジェクトをどのくらいスケーリングするかを制御します。

クリックしてフルサイズ表示。

ブループリントの設定例

MID などパラメータのカスタム データにより、ランタイムにブループリントまたはコードを使用して変更を加えることができます。次に示すグラフは、こうしたマテリアル パラメータの値を設定して保存し、ゲーム セッションの開始時にランダム カラー、エミッシブ、初期スケールを設定します。

クリックしてフルサイズ表示。

Event BeginPlay の発生時に、ブループリントで Set Custom Primitive Data ノードを使用して、2 つの CPD パラメータの色とスケールの値を初期化します。

クリックしてフルサイズ表示。

両方の Set ノードの [Data Index] は、マテリアルの同じ [Primitive Data Index] を使用してマテリアル パラメータを初期化します。

CDP_BPNodes_To_Material.png

Event Tick 発生時に、Set ノードは CPD パラメータのプリミティブ データ インデックスを参照して、それぞれのティックの Delay ノードに設定されたランダムな時間に基づき、新しい色とエミッシブの強度を設定します。この色は、XYZ に対するランダムな float 値の範囲により設定されます。XYZ は、マテリアルのベクター パラメータ式で RGB 値に変換されます。エミッシブの強度も、float 値で定義された範囲を使用して設定されます。

クリックしてフルサイズ表示。

Event Tick の設定と使用には注意が必要です。このデモで行う簡単なテストとデバッグには適していますが、ランタイムでの継続的な使用には必ずしも最適ではありません。

例の結果

この例の結果として、ブループリントによって制御されるいくつかの CPD を含むマテリアルが完成し、マテリアル パラメータを使用してメッシュの色、エミッシブ、スケールを設定することができます。

このページでは、 マテリアル インスタンス ダイナミクス (MID) に類似するものとして CPD の設定と使用方法を比較しています。理解を深めるために、これらに必要なマテリアルとブループリントの設定をそれぞれ実際に比較してみましょう。

マテリアルの設定で必要なのは、CPD を使用するパラメータで [Use Custom Primitive Data] を有効にすることと、後にブループリントで参照される [Primitive Data Index] を設定することのみです。MID の場合、後にブループリントで必要になるのはパラメータの名前のみです。

Example_Parameters.png

Example_ParametersCPD.png

MID マテリアル パラメータ

カスタム プリミティブ マテリアル パラメータ

次にブループリントの必須設定を比較します。

  • マテリアル インスタンス ダイナミクス ワークフロー:

    クリックしてフルサイズ表示。

    マテリアルでのインスタンス化に関する追加情報については、 「インスタンス化マテリアル」 を参照してください。

  • カスタム プリミティブ データ ワークフロー:

    クリックしてフルサイズ表示。

このワークフローも同じですが、ブループリントで実行する追加の手順がある点で異なります。MID ワークフローには、 Create Dynamic Material Instance ノードと、必要なパラメータのマテリアルにある文字列と一致する Parameter Name を参照する Set Parameter Value ノードがいくつか必要です。

レベル内でこれらの設定の両方をランタイムに比較すると、ビジュアルの面で同じであることがわかりますが、CPD には、メッシュ描画リファクタリングを使用してパフォーマンス上の節約を実現できるというメリットがあります。これについては以下のセクションで説明します。

左:カスタム プリミティブ データ ワークフロー。右:マテリアル インスタンス ダイナミクス ワークフロー。

パフォーマンス

CPD ワークフローには、レベル内に存在する、カスタム データでのマテリアル設定を使用する類似したジオメトリの描画呼び出しを大幅に削減するというメリットがあります。シーン プリミティブを自動的かつ動的にインスタンス化する Mesh Drawing (メッシュ描画) リファクタリングを使用して、描画呼び出しを削減します。

レベルで動的インスタンス化がどれだけ機能しているかを確認するには、コンソール (`) を開いて **stat scenerendering** コマンドを入力します。このコマンドは、現在のシーン ビューの一般的なレンダリング統計情報を表示します。レンダリング プロセスにおいて全般的に低パフォーマンスの領域と、シーンのメッシュ描画呼び出しとライトの数のカウンターをここで確認することから始めましょう。

CPD_StatSceneRendering.png

デフォルト レベルのシーン レンダリング統計情報。

レベル ビューポートでの作業中に G キーを押してゲーム ビュー モードを切り替えるか、[Play-In-Editor (PIE)] または [Simulation] を選択して、より正確な結果を取得します。これらのオプションをいずれも使用しない場合、指向性ライトのアイコンなど、他の描画呼び出しはエディタのみのジオメトリとなります。

このシーンの例では、フロア メッシュ、背景の Sky Sphere (天球) メッシュ、マテリアルでカスタム データを使用して複製したいくつかのメッシュから始めます。

CPD_StatSceneRenderin2a.png

シーン レンダリング統計情報に、このビューに現在登録されている描画呼び出しの数が表示されます。現在は全部で 14 個あります。

CPD_StatSceneRenderin2.png

エンジンによって描画呼び出しとメッシュ描画ポリシーが自動的かつ動的に結合されるため、動的インスタンス化を無効にして、このシーンで現在どの程度機能しているか確認することを推奨します。次のコマンドで無効にします。

r.MeshDrawCommand.DynamicInstancing 0

プリミティブのいくつかで Mesh draw calls (メッシュ描画呼び出し) の数が増えていることに注目してください。

CPD_StatSceneRenderin3.png

より劇的な違いを出すために、CPD を使用するメッシュをさらに複製します。この例ではさまざまなサイズの 25 の球体を用意します。

CPD_StatSceneRenderin4.png

  • 動的インスタンス化を無効にすると Mesh draw calls は 94 になります。MID を使用すると、CPD のようにインスタンス化されないため、同様の結果が得られます。

    CPD_StatSceneRenderin4a.png

  • 動的インスタンス化を再び無効にすると Mesh draw calls は 46 になります。

    CPD_StatSceneRenderin4b.png

マテリアルにカスタム データを保存して、レベル内で同様のジオメトリを使用する場合は、マテリアル インスタンス ダイナミクスなどの代替メソッドを使用する場合であっても、描画呼び出しの数に明確な違いを確認できます。

追記

  • Float Limit of 32

    • 今後のリリースで、これは [Project Setting (プロジェクト設定)] から構成できる設定になる予定です。

  • ユーザー定義のデフォルトおよびカスタム プリミティブ データ パラメータ値のオーバーライドに関するサポート

    • 現在、マテリアルでカスタム プリミティブ データ パラメータを設定する場合、デフォルト値は常に 0 です。エディタでの作業時に初期値を設定する場合は、マテリアルが割り当てられているメッシュでブループリントのコンストラクション スクリプトを使用してこれを行うことが可能です。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
閉じる