#UE4DD
Material管理の問題点と
Material と Material Instanceの仕組み
Epic Games Japan
Nori Shinoyama
#UE4DD
備考
• 4.13 & 4.14 で基本的には検証
• PS4で計測
• 資料はすぐに公開されます
#UE4DD
なぜMaterial管理を注意する必要があるか?
#UE4DD
エディタで視覚的にマテリアルを作成することが可能
エンジニア以外も自由にマテリアルを作れる
#UE4DD
マテリアルは大量につくられ、管理が大変になりがち。
#UE4DD
マテリアルで問題となる複数の視点
Management 誰が作るの? 命名規則は? どこに置くの?
Development
日々の開発を効率的に、
イテレーションしやすく
Runtime
処理が重たい、
メモリに乗らない
パッケージサイズでかすぎ
#UE4DD
マテリアルワークフローの悪循環
Management
Development
Runtime
2. 関連するマテリアルってどれ?
3. 終わらないShader Compile
1. 処理が重たい、メモリに乗らない。
パッケージサイズがでかすぎる。
#UE4DD
マテリアル構成は、
管理のしやすさだけではなく、
Runtimeや日々のイテレーションも考慮した方が良い
開発後半の抜本的修正は非常に苦痛
#UE4DD
マテリアルが問題となる問題となる複数の視点
Management
Development
Runtime
はじめに、
気をつけるべき点とその仕組みを
Epic Gamesがご説明。
#UE4DD
マテリアルが問題となる問題となる複数の視点
Management
Development
Runtime
その後、実タイトルがどのように
実践しているかを、
バイキング様、
SQEX様に
ご説明していただきます。
#UE4DD
アジェンダ
1. マテリアル開発の基本イメージ
2. マテリアルとは?
3. マテリアルインスタンスとは?
4. まとめ
#UE4DD
アジェンダ
1. マテリアル開発の基本イメージ
2. マテリアルとは?
3. マテリアルインスタンスとは?
4. まとめ
#UE4DD
マテリアルをノードベースで作成できる。
#UE4DD
このマテリアル機能だけだと。。。
#UE4DD
Material
A
Material
B
同じ処理が様々な
マテリアルに
テクスチャやパラメータ
だけが違うマテリアル
#UE4DD
共通項を抽出する2つの機能
同じ処理が様々な
マテリアルに
テクスチャやパラメータ
だけが違うマテリアル
Material
Function
Material
Instance
#UE4DD
Material Function
#UE4DD
様々なマテリアルで同様の機能を
組むことに
Material
A
Material
B
Material
C
#UE4DD
Material Function
マテリアルエディタで内で使用できる関数のノードを
作成する
#UE4DD
Material Functionで関数を共通化
Material
A
Material
B
Material
C
参照
Material Function
#UE4DD
Material Instance
#UE4DD
マテリアルだけならば、テクスチャ差し替えやパラメータを変
えるだけでも、別マテリアルを用意しなければいけない。
#UE4DD
Material Instance
親マテリアルに設定されたパラメータなどを
独自に設定(上書き)できるマテリアル
Material
Material
Instance
Material
Instance
#UE4DD
Material Instance
親マテリアルに設定されたパラメータなどを
独自に設定(上書き)できるマテリアル
Material
Material
Instance
Material
Instance
親のマテリアルにパラメータを追加
#UE4DD
Material Instance
親マテリアルに設定されたパラメータなどを
独自に設定(上書き)できるMaterial
Material
Material
Instance
Material
Instance
子のマテリアルにパラメータが出て
上書き可能に
#UE4DD
乱立していたマテリアルが。。。
#UE4DD
一つのマスターマテリアル(ベースマテリアル)と
それが持つパラメータの上書きで表現可能に。
#UE4DD
Tips: Static Switch Parameterで
マテリアルの処理を”静的に”切り替える事が可能。
Material
Material
Instance
Material
Instance
#UE4DD
Tips: Static Switch Parameterで
マテリアルの処理を”静的に”切り替える事が可能。
Material
Material
Instance
Material
Instance
#UE4DD
Tips:
マテリアルインスタンスはマテリアルインスタンスを親にできます。
Material
Material
Instance
Material
Instance
Material
Instance
Material
Instance
例: マスターマテリアルのパラメータ
・色
・テクスチャ
#UE4DD
Tips:
マテリアルインスタンスはマテリアルインスタンスを親にできます。
Material
Material
Instance
Material
Instance
Material
Instance
Material
Instance
子供: Textureを指定
孫 : 色を指定
色違いのオブジェクトやキャラクタなどに
#UE4DD
まとめ
#UE4DD
まとめ
Material
Material
Instance
Material
Instance
Material
Instance
Material
Instance
1. Material間の共有機能は
Material Functionにまとめる
2. 適切なパラメータをMaterialから抽出し
Material Instanceを作成。
Materialの共通化を行う。
(Switch パラメータでシェーダの挙動を
静的に変更可能)
Material
Material Function
Material Function
Material Function
#UE4DD
ここまでが基本的なイメージかと思います。
#UE4DD
では、どんな構成にしていくべきか?
Mat
Inst Inst Inst
Mat
Inst Inst
Mat
Inst Inst
Mat
Inst Inst
一つの大きな
マスターマテリアルから派生
複数のマスターマテリアルから
インスタンスを都度作成。
孫を許す?
#UE4DD
ということで、
マテリアルとマテリアルインスタンスについて
もう少し深くみていきたいと思います。
#UE4DD
アジェンダ
1. マテリアル開発の基本イメージ
2. マテリアルとは?
3. マテリアルインスタンスとは?
4. まとめ
#UE4DD
質問
1つのマテリアルを表現するために必要なシェーダは
何個でしょうか?
#UE4DD
Color Buffer Depth Buffer
赤いポリゴンが一枚描画されるところをイメージします。
From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
#UE4DD
描画の流れをGPU的に追っていきます。
Color Buffer Depth Buffer
Pixel Shader
Rasterizer
Vertex Shader
From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
#UE4DD
描画の流れをGPU的に追っていきます。
Color Buffer Depth Buffer
Pixel Shader
Rasterizer
Vertex Shader
頂点シェーダで、画面のどこにポリゴンがあるかを計算します。
From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
#UE4DD
描画の流れをGPU的に追っていきます。
Color Buffer Depth Buffer
Pixel Shader
Rasterizer
Vertex Shader
ラスタライザでそのポリゴンがどのピクセルを埋めるかを判断します。
From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
#UE4DD
描画の流れをGPU的に追っていきます。
Color Buffer Depth Buffer
Pixel Shader
Vertex Shader
そしてPixel Shaderでピクセルの色を計算する
Rasterizer
From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
#UE4DD
Pixel Shader
Vertex Shader
Material
一つのオブジェクトをレンダリングするには
頂点シェーダとピクセルシェーダが必要。
ならば、少なくとも2つはシェーダが必要だ。
。。。2つだけ?
#UE4DD
様々なオブジェクトの属性が、
様々なライティングをされます。
#UE4DD
一つのマテリアルでも。。。
#UE4DD
様々なオブジェクトにアサインして、
レンダリングすることができます。
※マテリアルドメインが違うものはアサインできません。
例: ポストプロセス用マテリアルを、メッシュにアサインするなどはできない。
#UE4DD
これが可能なのは、
マテリアルは様々な場合に応じたシェーダを保持し、
それぞれの場合に応じて使用しているからです。
Material
Shader Shader Shader Shader
#UE4DD
よくある疑問。。
Material
Shader!!
全部に対応できる高性能シェーダを
1つ作れば良いんじゃないの?
#UE4DD
Color Buffer
Pixel Shader
シェーダは、
一度に沢山の頂点と沢山のピクセルを計算する
Vertex Shader
Depth Buffer
#UE4DD
Pixel Shader
シェーダの小さな負荷増減 -> GPUの処理負荷激増なことも
Vertex Shader 頂点シェーダの負荷 × 頂点の数
ピクセルシェーダの負荷 × ピクセルの数
#UE4DD
描画負荷を軽くするために、
シェーダはなるべくシンプルにする
(これはもうそういうものだと思っていただければ。。。)
#UE4DD
Material
Shader Shader Shader Shader
そのため、使用方法に応じたシェーダを
複数持つ必要があります。
#UE4DD
Tips: コンパイルされるシェーダソースを表示する
r.DumpShaderDebugInfo
Engine/Config/ConsoleVariables.ini
#UE4DD
GAMEPROJECT/Saved/ShaderDebugInfo に、
シェーダが書き出されます。
#UE4DD
Materialのデータのメインは、
使われる複数のシェーダ
Shader
Binary
…
01001000…
01001000…
01001000…
Material
※非常にシンプルなシェーダは、予めエンジンが保有しており、それの参照のみ
#UE4DD
これを意識しておかないと。。。
#UE4DD
1個で30MBのマテリアルに
#UE4DD
終わらない Shader Compile
#UE4DD
マテリアルのサイズ&コンパイル時間増加の原因
シェーダサイズ × シェーダの数
#UE4DD
朗報
#UE4DD
UE4.14から、マテリアル内部の
シェーダはそれぞれ圧縮されるようになります。
Shader
Binary
…
01001000…
01001000…
01001000…
Material
Compressed
Shader
Binary
…
sb
sb
sb
Material
4.13 4.14
#UE4DD
Loading Render
Memory
(4.14)
Compressed
Shader
Binary
…
sb
sb
sb
Shader
Binary
01001000…
Decompress
Runtime (4.14)
HDD
Mat
使用されるShaderだけ展開されるので、
ロード時間、メモリどちらにもやさしい。
#UE4DD
4.14からマテリアルのサイズがぐっと減ります。
4.13 4.14
Material A 236kb 62kb
Material B 38KB 31Kb
あるマテリアルのPS4用クックの比較
#UE4DD
備考 クックあとのuassetの場所。
GAMEPROJECT/Saved/Coocked/PLATOFORM_NAME/Content…
#UE4DD
4.14でサイズは改善されますが、
気にしなくていいサイズにはなっていません。
また、
この改善はシェーダコンパイル時間には影響しません
#UE4DD
マテリアルのサイズ&コンパイル時間増加の原因
シェーダサイズ × シェーダの数
#UE4DD
マテリアルのサイズ&コンパイル時間増加の原因
シェーダサイズ × シェーダの数
#UE4DD
悪意をもってシェーダの数を増やしてみる。
1個のマテリアルで240個のシェーダを保有
#UE4DD
では、不要なシェーダを減らすために
何をすべきか?
#UE4DD
減らす方法二点
1. 不要なUsageを減らす
2. 4.13からのShader Permutation Reductionを
使う
#UE4DD
減らす方法二点
1. 不要なUsageを減らす
2. 4.13からのShader Permutation Reductionを
使う
#UE4DD
様々な”使用法” = “Usage”について、
それぞれ別にShaderを生成する。
Material
Shader Shader Shader Shader
#UE4DD
Material の Usage項目
このマテリアルが、
どの様なオブジェクトに
アサインされているかを指定する。
#UE4DD
Material の Usage項目
#UE4DD
“Automatically Set Usage in Editor” オプション
“Automatically Set Usage in Editor”
(Default: ON)
オブジェクトにアサインした際に、必要
なUsage項目に自動的にチェックを着け
てくれる機能。
※注意点:
アサインを外したりオブジェクトを消し
ても、自動的にOffになりません。
#UE4DD
Usageがついてない場合、
Defaultマテリアルに差し替えられる。
#UE4DD
サイズ比較
ありったけUsageにチェック = 1837KB
Staticにだけチェック = 97KB
#UE4DD
不要なUsageがついてないか確認しましょう。
(残念ながら、全マテリアルのUsageを
自動でチェックする機能などは現状ありません。)
#UE4DD
減らす方法二点
1. 不要なUsageを減らす
2. Shader Permutation Reduction
#UE4DD
Usageとは別に、
ライティングやポスト処理の組み合わせに対応できるよう、
使用有無に関係なく前もって沢山のシェーダを持つ。
Material
Shader Shader Shader Shader
#UE4DD
Project Settings / Rendering
Shader Permutation Reduction
• プロジェクトで使わない機能を前もって指定す
ることで、その機能のシェーダを生成しない
#UE4DD
OFFのままその機能を使うと警告が出る
(レンダリングはされない)
Project Settings / Rendering
Shader Permutation Reduction
#UE4DD
このマテリアルで検証。
(usageはstatic lightingのみ。)
#UE4DD
全部つけたもの vs 全部消したもの
25 17
シェーダ数を32%削減
#UE4DD
Project Settings / Rendering
Shader Permutation Reduction
• 4つのオプションをそれぞれ見ていく。
#UE4DD
Shader Permutation Reduction
Support Stationary Skylight
#UE4DD
Shader Permutation Reduction
Support Stationary Skylight
消えるシェーダ
#UE4DD
Shader Permutation Reduction
Support low quality lightmap shader permutations
モバイル用ライトマップを使うか
(WinやPS4/Xbox開発だけならば使わない)
#UE4DD
Shader Permutation Reduction
Support low quality lightmap shader permutations
消えるシェーダ
#UE4DD
Shader Permutation Reduction
Support Atmospheric Fog
#UE4DD
Shader Permutation Reduction
Support Atmospheric Fog
消えるシェーダ
#UE4DD
Shader Permutation Reduction
Support Pointlight WholeSceneShadows
#UE4DD
Shader Permutation Reduction
Support Pointlight WholeSceneShadows
• このオプション。。
– いまのところ、シェーダ削減は何もしていない。
– UE-40363として対応中。
• "Support PointLight WholeSceneShadows" option
doesn't seem to reduce shader permutations
#UE4DD
4.15からMobile用
Shader Permutation Reductionも。
#UE4DD
Project Settings / Rendering
Shader Permutation Reduction
• プロジェクトで使わない機能を前もって指定す
ることで、その機能のシェーダを生成しない
#UE4DD
シェーダの数を減らす方法二点
1. 不要なUsageを減らす
2. Shader Permutation Reduction
#UE4DD
マテリアルのサイズ&コンパイル時間増加の原因
シェーダサイズ × シェーダの数
#UE4DD
シェーダサイズの調べ方
• コンソールのGPUプロファイラならば、そのサイズがわかる
– PS4: Razor GPU
– XBOX: PiX
• r.DumpShaderDebugInfoでダンプされるソースファイルを
コンパイルして生成(付属のバッチをたたく)
– ※(Windows版はコンパイラのパスが間違っているので修正対応中)
– UE-40364
• Batches for PCD3D_SM5 in ShaderDebugInfo fail
due to not finding a path to fxc.exe
#UE4DD
毎回バッチ叩いたり、
起動してキャプチャとったりは
めんどくさい。。。
#UE4DD
StatsのInstructionsの数と
シェーダのサイズは相関があります
#UE4DD
命令数とマテリアルの相関
4.13 4.14
命令数:
30
38KB 31KB
命令数:
2500
236KB 62KB
とあるマテリアルで計測
Usage: Static Lightingのみ
Platform: PS4
(命令数はStatsの表示を記載)
#UE4DD
じゃあ、どうすれば命令数を少なくできる?
正直、難しい。。。
不要な計算をしていないかなどの確認ぐらいか。。
#UE4DD
もしも命令数を減らしたかったら。。
• 命令数が多いノードの使用を控える
– Noise
– POM
– (他にもありそう。。要調査)
• よく見られる不要なノード
– Min / Max / Clamp
– lerp
#UE4DD
番外編
シェーダ命令数は、
サイズよりも処理負荷の観点で見ることが多いので、
ここで、補足説明をしておきます。
#UE4DD
注意点
シェーダの命令数 ≠ シェーダの重たさ
(大雑把に見れば=でもいいけど。。。)
(Cycle数と言おうか。。)
#UE4DD
命令数と処理負荷の違い:1
1命令の重たさの違い
パスワード変更しといて
GDCでアテンドしてきて
どちらも同じ1行(命令)だけれども、
タスク量(Cycle数)が違う。
#UE4DD
命令数と処理負荷の違い:2
同じシェーダでも処理負荷がランタイムで変わる
コンパイラは賢い。 アルファテストのあるシェーダを
アルファテスト -> 色と計算するようにしたりする。(Early Exit)
色の計算
アルファテスト透明部分の処理負荷
アルファテスト不透明部分の処理負荷
#UE4DD
命令数と処理負荷の違い:3
命令の仕方の違い
命令数: 50
ビールで乾杯;
もう一杯;
もう一杯;
もう一杯;
…
もう一杯;
命令数: 1
50杯ビール飲む;
50行
1行
※あくまでイメージです。コンパイラは賢く処理するし、実際にForLoopが1命令になるわけではありません。
#UE4DD
注意点
シェーダの命令数 ≠ シェーダの重たさ
(大雑把に見れば=でもいいけど。。。)
(Cycle数と言おうか。。)
#UE4DD
シェーダの命令数とシェーダの重たさの違う例1
悪意をもってマテリアルを作ると。。。スフィアに貼り付けただけで、
39命令のシェーダでも、
20msの処理負荷に
#UE4DD
シェーダの命令数とシェーダの重たさの違う例2
悪意をもってマテリアルを作ると。。。スフィアに貼り付けただけで、
2533命令のシェーダでも、
0.04msの処理負荷で済む。
#UE4DD
このように、
処理負荷は命令数だけでは厳密にはわかりません。
一番怖いのは、
効果の少ない最適化をしてしまうこと
Statsを見て
必死に命令数を減らしても効果がないかもしれません。
ダメな例:
テクスチャの参照回数がネックなのに、
キャラの重要な強調表現を端折る。
#UE4DD
GPUの処理負荷が気になる場合、
エンジニアにご相談を。
#UE4DD
マテリアルのサイズ&コンパイル時間増加の原因
シェーダサイズ × シェーダの数
#UE4DD
マテリアルのまとめ
#UE4DD
マテリアルの中には様々な用途に応じた
シェーダが入っています。
Shader
Binary
…
01001000…
01001000…
01001000…
Material
Compressed
Shader
Binary
…
sb
sb
sb
Material
4.13 4.14
#UE4DD
マテリアルのサイズ&コンパイル時間増加の原因
シェーダサイズ × シェーダの数
#UE4DD
マテリアルのサイズ&コンパイル時間増加の原因
シェーダサイズ × シェーダの数
対策
1. 不要な “Usage” の消去
2. Shader Permutation Reduction
#UE4DD
マテリアルのサイズ&コンパイル時間増加の原因
シェーダサイズ × シェーダの数
対策
1. 可能ならば、不要な計算式の除去
(命令数だけで最適化を進めるのは控えた方がよい)
#UE4DD
最後に、悪意をもってマテリアルを作ってみる
• 可能なUsage全てをON
• Shader Permutation Reductionを使わない
• 命令数2500
• UE4.13
30MB超えマテリアルのできあがり。
#UE4DD
アジェンダ
1. マテリアル開発の基本イメージ
2. マテリアルとは?
3. マテリアルインスタンスとは?
4. まとめ
#UE4DD
1. 参照するマテリアルはどれか?
2. 上書きするパラメータの値
Shader Shader Shader Shader…
Material Instanceは何のデータを持つか
Material
Instance
Material
Instance
Material
#UE4DD
なので、Material Instanceのデータサイズは軽い
Material 30KB
Material Instance 2KB
#UE4DD
しかし。。。マテリアルインスタンスが
マテリアルのデータぐらい大きくなる場合がある。
Material 30KB
Material Instance 30KB
#UE4DD
Shader Shader Shader Shader…
親と違うShaderを使わなければいけないとき、
マテリアルインスタンスは独自のシェーダを保有する。
Material
Instance
Material
Instance
Shader Shader Shader ShaderMaterial …
親と別のシェーダが必要!
名前はマテリアルインスタンスだが、中身はほぼマテリアルと一緒
#UE4DD
どんなときに、
マテリアルインスタンスは別のシェーダを持つのか?
#UE4DD
独自のシェーダを必要としない場合
• テクスチャ
• 数値パラメータ
これらは別のシェーダを
必要としない。
#UE4DD
マテリアルインスタンスが
別シェーダを必要とするとき
1. Override properties
2. Static Switch
Parameter
3. Static Component Mask
Parameter
#UE4DD
マテリアルインスタンスが
別シェーダを必要とするとき
1. Override properties
2. Static Switch
Parameter
3. Static Component Mask
Parameter
#UE4DD
マテリアルインスタンスが
別シェーダを必要とするとき
1. Override properties
2. Static Switch
Parameter
3. Static Component Mask
Parameter
#UE4DD
マテリアルインスタンスが
別シェーダを必要とするとき
1. Override properties
2. Static Switch
Parameter
3. Static Component Mask
Parameter
#UE4DD
上記オーバライドを行うと、シェーダの書き換えが必要なため、
Material Instanceもシェーダを持ちます。
Material
Instance
Material
Instance
Shader Shader Shader ShaderMaterial …
Shader Shader Shader Shader…
親と別のシェーダが必要!
#UE4DD
Inst Inst Inst
想像できる恐怖
全てのマテリアルインスタンスがそれぞれシェーダを持つ
Mat
#UE4DD
Tips: 孫のマテリアルインスタンス
Material
Instance
Material
Instance
Material
Instance
Shader Shader Shader Shader…Material
Shader Shader Shader Shader…
Material
Instance
前述のオーバライドを行わなければ、
親のシェーダを参照する。
#UE4DD
マテリアルインスタンスの組み方で
サイズが変わる簡単な一例を。。
#UE4DD
パラメータは三つ
1.)テクスチャ、 2)テクスチャ使用有無, 3) 乗算される色
Material
Material
Instance
Material
Instance
#UE4DD
どちらがよいでしょうか?
Material
Instance
Material
#UE4DD
どちらがよいでしょうか?
switch switch switch switch
まず最初に色を変える。
1
その後に、UseTextureスイッチをOnに
して、テクスチャをあてがう。
2
末端のマテリアルインスタンス4つがシェーダを持つ。
#UE4DD
どちらがよいでしょうか?
子の2つがシェーダを持ち、孫の4つはシェーダを持たない。
switch switch
その後に色を変える。
2
Use TextureスイッチをOnにして、
テクスチャをあてがう
1
#UE4DD
どちらがよいでしょうか?
データサイズやロード時間を考えると,右の方が良い。
(赤で囲まれたマテリアルインスタンスがシェーダを持つ)
switch switch
switch switch switch switch
#UE4DD
Inst Inst Inst
サイズやロードを加味したマテリアルインスタンスの構築
スイッチやプロパティのオーバライドは、
なるべく上位のインスタンスでやる。
Mat
こうすれば
その子供達は
シェーダを持たない
上の方で
スイッチを使う
#UE4DD
Switchを上の方で行えば左側の作り方でもOK?
Mat
Inst Inst Inst
Mat
Inst Inst
Mat
Inst Inst
Mat
Inst Inst
一つの大きな
マスターマテリアルから派生
複数のマスターマテリアルから
インスタンスを都度作成。
孫を許す?
#UE4DD
Tips
マテリアルインスタンス VS 親マテリアルのUsage
#UE4DD
Material の Usage項目
再掲載
#UE4DD
Tips: マテリアルインスタンスはUsageを持たない。
親のマテリアルのUsageをOnにする。
Material
Inst Inst Inst Inst
#UE4DD
Mat
Inst Inst Inst
一つの大きな
マスターマテリアルから派生
• 管理も難しく、
• 一つのシェーダ修正が
沢山のマテリアルインスタンスに影響し
• 更にUsageが爆発するのでおすすめできない。
はおすすめできない
#UE4DD
Mat
Inst Inst Inst
Mat
Inst Inst
Mat
Inst Inst
Mat
Inst Inst
一つの大きな
マスターマテリアルから派生
複数のマスターマテリアルから
インスタンスを都度作成。
程よく分散しましょう
#UE4DD
アジェンダ
1. マテリアル開発の基本イメージ
2. マテリアルとは?
3. マテリアルインスタンスとは?
4. まとめ
#UE4DD
Advanced
シェーダを持つマテリアルインスタンス
の
コンパイルとメモリ展開
#UE4DD
Inst Inst Inst
みんながシェーダを持つとコンパイルも大変だし
メモリがすぐ埋まってしまいそうだ。。。
Mat
#UE4DD
ShaderCompile
Shader
Shader
Shader
Shader
InstA
Switches
Shader
Shader
Shader
Shader
InstB
Switches
Shader
Shader
Shader
Shader
InstC
Switches
マテリアルインスタンスのシェーダコンパイルの流れ
同じスイッチの組み合わせならば、
前のシェーダをコピーする
同じ組み合わせのシェーダコンパイルは一度しか起きない
#UE4DD
Loading
Shader
Shader
Shader
Shader
InstA
Switches
Shader
Shader
Shader
Shader
InstB
Switches
Shader
Shader
Shader
Shader
InstC
Switches
マテリアルインスタンスのロードの流れ
#UE4DD
Loading
Shader
Shader
Shader
Shader
InstA
Switches
Shader
Shader
Shader
Shader
InstB
Switches
InstC
Switches
自身のシェーダをメモリから消して、先のを参照する
マテリアルインスタンスのロードの流れ
同一組み合わせのシェーダは一つのインスタンスのみ生き残る
#UE4DD
Inst Inst Inst
シェーダコンパイルやメモリに残る量は、
組み合わせの数以上は起きない。
Mat
#UE4DD
Advanced
シェーダを持つマテリアルインスタンス
の
コンパイルとメモリ展開
おしまい
#UE4DD
アジェンダ
1. マテリアル開発の基本イメージ
2. マテリアルとは?
3. マテリアルインスタンスとは?
4. まとめ
#UE4DD
マテリアルが問題となる複数の視点
Management
Development
Runtime
誰が作るの? 命名規則は? どこに置くの?
日々の開発を効率的に、
イテレーションしやすく
処理が重たい、
メモリに乗らない。
#UE4DD
マテリアル
#UE4DD
マテリアルの中には様々な用途に応じた
シェーダが入っています。
Shader
Binary
…
01001000…
01001000…
01001000…
Material
Compressed
Shader
Binary
…
sb
sb
sb
Material
4.13 4.14
#UE4DD
マテリアルのサイズ&コンパイル時間増加の原因
シェーダサイズ × シェーダの数
#UE4DD
マテリアルのサイズ&コンパイル時間増加の原因
シェーダサイズ × シェーダの数
対策
1. 不要な “Usage” の消去
2. Shader Permutation Reduction
#UE4DD
マテリアルのサイズ&コンパイル時間増加の原因
シェーダサイズ × シェーダの数
対策
1. 可能ならば、不要な計算式の除去
(命令数だけで最適化を進めるのは控えた方がよい)
#UE4DD
マテリアルインスタンス
#UE4DD
1. 参照するマテリアルはどれか?
2. 上書きするパラメータの値
Shader Shader Shader Shader…
Material Instanceは何のデータを持つか
Material
Instance
Material
Instance
Material
#UE4DD
Shader Shader Shader Shader…
親と違うShaderを使わなければいけないとき、
マテリアルインスタンスは独自のシェーダを保有する。
Material
Instance
Material
Instance
Shader Shader Shader ShaderMaterial …
親と別のシェーダが必要!
名前はマテリアルインスタンスだが、中身はほぼマテリアルと一緒
#UE4DD
マテリアルインスタンスが
別シェーダを必要とするとき
1. Override properties
2. Static Switch
Parameter
3. Static Component Mask
Parameter
#UE4DD
Inst Inst Inst
サイズやロードを加味したマテリアルインスタンスの構築
スイッチやプロパティのオーバライドは、
なるべく上位のインスタンスでやり、
その下で単純なパラメータを編集する。
Mat
こうすれば
その子供達は
シェーダを持たない
上の方で
スイッチを使う
#UE4DD
Tips: マテリアルインスタンスはUsageを持たない。
親のマテリアルのUsageをOnにする。
Material
Inst Inst Inst Inst
#UE4DD
Mat
Inst Inst Inst
一つの大きな
マスターマテリアルから派生
• 管理も難しく、
• 一つのシェーダ修正が
沢山のマテリアルインスタンスに影響し
• 更にUsageが爆発するのでおすすめできない。
はおすすめできない
#UE4DD
Mat
Inst Inst Inst
Mat
Inst Inst
Mat
Inst Inst
Mat
Inst Inst
一つの大きな
マスターマテリアルから派生
複数のマスターマテリアルから
インスタンスを都度作成。
程よく分散しましょう
#UE4DD
まとめ
Management
Development
Runtime
マテリアルとマテリアルインスタンスの
データ構造から、
マテリアル構築時の注意点をみてきました。
ランタイムやコンパイル時間に影響するので、
開発後半で致命的にならないよう、
開発初期に、検討してみてください。
#UE4DD
まとめ
Management
Development
Runtime
Byking様、
SQEX大阪様の
セッションへGO!
#UE4DD
End

マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (Epic Games Japan: 篠山範明) #UE4DD

Editor's Notes

  • #65 (4.13でサイズなどの検討をしている方、CL: 3117797をマージしてみてください。)
  • #92 BASEPASS_ATMOSPHERIC_FOG が頂点シェーダに追加。