27K Views
November 18, 23
スライド概要
2023.11/17日に開催されたUE コミュニティイベントUE Tokyo .devの登壇スライドです。
経験・検証による内容が多いためご指摘等ありましたら X でご連絡くださいよろしくお願いいたします。
イベントURL↓
https://ue-community-tokyo.connpass.com/event/297057/
Unreal Engine 動的マテリアル更新 ノウハウ
自己紹介 ● 趣味で Unreal Engine のブログ (ゲーム開発備忘録)を書いています。 ● ギターとインディーゲームと猫が好きです。 ● X のフォローよろしくお願いいたします! koituwasugee ゲーム開発備忘録 # UE Tokyo .dev
環境 と 前置き ● Unreal Engine 5.3.1 (Launcher 版) ● CPU - AMD Ryzen5 5600X 6 - Core Processor ● メモリ - 32.0GB ● GPU - RTX 3070 ● 本公演の内容は個人の経験と検証に基づく内容です。 参考程度にお聞きください。 ● スライドは後日公開予定です。 # UE Tokyo .dev
マテリアル による見た目の変更 何を使っていますか? # UE Tokyo .dev
マテリアルを変更する主な機能 Set Material Dynamic Material Instances Custom Primitive Data Material Parameter Collection # UE Tokyo .dev
いっぱいあるけど、 何を使うのがいい?? # UE Tokyo .dev
それぞれ特徴を見ていこう Set Material Dynamic Material Instances Custom Primitive Data Material Parameter Collection # UE Tokyo .dev
まずは、Set Material から Set Material Dynamic Material Instances Custom Primitive Data Material Parameter Collection # UE Tokyo .dev
Set Material Material Mesh # UE Tokyo .dev
Set Material ● メッシュに対して 事前に準備したマテリアルや マテリアルインスタンスを 適用する方法。 ● Element Index の数字が メッシュのマテリアルの Index に対応している。 # UE Tokyo .dev
Set Material メリット ● ● マテリアルの属性( Modeや Model)が異なる マテリアルを適用することが できる Element Index により、 変更したいモデルの部位を 指定できる デメリット ● マテリアル内で利用して いる値を変更できない ● 色違いなど、パターンが ある場合、パターン毎に マテリアルを事前に用意す る必要がある ● 負荷が大きい ⇒ マテリアルの属性をどうしても変えたい時に しぶしぶ利用することが多い。 # UE Tokyo .dev
マテリアルを変更する主な機能 Set Material Dynamic Material Instances Custom Primitive Data Material Parameter Collection # UE Tokyo .dev
Dynamic Material Instances ( MID ) 生成 Material Create MID 加工 Mesh BP # UE Tokyo .dev
Dynamic Material Instances ( MID ) ● ダイナミックマテリアルインスタンスは その名の通り、ランタイム(実行時)にインスタンスを生成して、 内部の変数を変更できるマテリアル。 ● マテリアル内で変数化された値の名前を利用して BP から動的に制御できる。 # UE Tokyo .dev
Dynamic Material Instances ( MID ) メリット ● マテリアルで変数化した、 Scalar / Vector / Texture など 幅広い値を BP から 動的に制御できる デメリット ● 複数のマテリアルを 変更したい場合、 BP 側の実装が大変 ● アクタを跨ぐマテリアルの 同時制御は苦手 ● 似たノードでSet ~ Parameter Value on Materials があるが、 これは全く別物 ⇒ 使い勝手が良いが制御したいマテリアル数が増えると管 理やパフォーマンス調整が大変なので注意が必要。 # UE Tokyo .dev
マテリアルを変更する主な機能 Set Material Dynamic Material Instances Custom Primitive Data Material Parameter Collection # UE Tokyo .dev
Custom Primitive Data ( CPD ) 加工 Material Primitive BP # UE Tokyo .dev
Custom Primitive Data ( CPD ) ● カスタムプリミティブデータも MID 同様 ランタイム(実行時)に値を変更できるマテリアル。 ● マテリアル内で変数化され、 UseCustomPrimitive が 有効になっている Scalar / Vector のみ BP から 動的に制御できる。 # UE Tokyo .dev
Custom Primitive Data ( CPD ) ● プリミティブ自体に固有のカスタムデータを 保存することができる。 ● そのため、動的制御以外にも同一マテリアルで、 パラメータのみを詳細から変更できる機能が非常に便利。 # UE Tokyo .dev
Custom Primitive Data ( CPD ) メリット ● Auto Instancing で ドローコールの軽減 ● BP 側の準備が容易 ● Target がプリミティブ なのでマテリアルが別でも Index を揃えれば実装を共 通化できる デメリット ● Scalar / Vector しか 利用できず Texture などを直接指定できない ● パラメータ上限が 32 ⇒ MIDを使う前にCPDで実装できないか考える。 草や木などAuto Instancingが活用できそうな部分で積 極的に活用。 # UE Tokyo .dev
マテリアルを変更する主な機能 Set Material Dynamic Material Instances Custom Primitive Data Material Parameter Collection # UE Tokyo .dev
Material Parameter Collection ( MPC ) MPC Mesh BP Material # UE Tokyo .dev
Material Parameter Collection ( MPC ) ● 独立したアセット、マテリアルパラメータコレクションで 定義した Scalar / Vector の値を動的に制御できる。 ● マテリアル内でマテリアルパラメータコレクションを 配置することでマテリアルを横断してパラメータを 一括で制御できる。 # UE Tokyo .dev
Material Parameter Collection ( MPC ) メリット デメリット ● マテリアルを横断した パラメータを一括で 制御できる ● 複数のマテリアルに 独立した値を設定する 用途に向かない ● パラメータの選択が プルダウンメニューから 指定できるので設定が 分かりやすい ● 複数箇所から制御すると 意図しない値になる可能性 があるので注意 ● 複数のアセットとの依存が 強くなるため注意が必要 ● パラメータ上限が 1024 ● シーケンサーから 扱いやすい ⇒ 背景演出や、シーケンサーによるカットの作成など、大規 模な変更や視認性を重視する場合に利用。 # UE Tokyo .dev
負荷検証 - 実践 - # UE Tokyo .dev
負荷検証 - 前提 ● 1秒おきにマテリアルを変更する BP # UE Tokyo .dev
負荷検証 - 前提 ● 1秒おきにマテリアルを変更する BP ● 真上から撮影してカメラは動かない ● 4種類のメッシュを割り当てた BP 3,615個を配置して負荷を検証 ● 実行時負荷は通常 85~110FPS # UE Tokyo .dev
負荷検証 - Set Material ● あらかじめ用意したマテリアル 5種を ランダムで選択して反映 # UE Tokyo .dev
負荷検証 - Set Material ● Mesh draw calls は 35 ~ 41 と比較的軽量 ● ピーク時負荷 9 ~ 10 FPS まで低下 # UE Tokyo .dev
負荷検証 - MID and CPD ● BP それぞれで変数化した Vectorパラメータに ランダムな値を入れる ▼ MID ▲ CPD # UE Tokyo .dev
負荷検証 - MID and CPD ● いずれもピーク時負荷 19 ~ 24 FPS SetMaterialよりも軽量だが、 この2つの検証では大きな差はみられなかった ( 単一のマテリアルを使っていたからかも ) ● Mesh draw calls は MID 2915 ~ 2950 CPD 19 ~ 25 と大きな差があった。 ▼ MID ▲ CPD # UE Tokyo .dev
負荷検証 - MPC ● BP それぞれで変数化した Vectorパラメータに ランダムな値を入れる ● MPCの特性上同一の値になってしまう。 # UE Tokyo .dev
負荷検証 - MPC ● ピーク時負荷 24 ~ 29 FPS 個別にランダムなマテリアルを入れている他のものと異なり、 同じ値が入ってしまうので比較できる結果は得られなかった。 解説でも出したようにランダムな値を制御する場合は他の手段が良い。 ● Mesh draw calls は 21 ~ 42 # UE Tokyo .dev
まとめ Set Material Dynamic Material Instances (MID) Custom Primitive Data (CPD) Material Parameter Collection (MPC) 事前準備 △ 事前に全パターンを 用意する必要あり △ BP側のランタイム 生成と管理が煩雑 ◎ マテリアルの変数化と Index の指定 〇 アセットの 作成と利用 個別制御 × ケースごとに 大量の分岐が必要 ◎ パラメータの 種類が豊富 〇 MIDより少ないが マテリアルの工夫次第 × MPCのパラメータ量を 増やす必要あり 同時制御 × 管理クラスが必要 × 管理クラスが必要 × 管理クラスが必要 ◎ MPCを制御するだけ △ ヒッチの原因になるかも 〇 インスタンスの 生成タイミングや 生成数の調整が必要 ◎ 条件により Auto Instancing の恩恵を受けられる △ 依存の増加に よるロード負荷 負荷 # UE Tokyo .dev
まとめ Yes Yes Material Parameter Collection 複数同時に 制御したい No マテリアルの属性 (Mode や Model) が異なる No Set Material Yes Custom Primitive Data 同じメッシュ が大量にある No Dynamic Material Instances # UE Tokyo .dev
ご清聴ありがとうございました! # UE Tokyo .dev