Click here to load reader
Upload
-epic-games-japan
View
10.749
Download
5
Embed Size (px)
Citation preview
#UE4DD
Material 管理の問題点とMaterial と Material Instance の仕組み
Epic Games JapanNori 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
MaterialA
MaterialB
同じ処理が様々なマテリアルに
テクスチャやパラメータだけが違うマテリアル
#UE4DD
共通項を抽出する2つの機能
同じ処理が様々なマテリアルに
テクスチャやパラメータだけが違うマテリアル
MaterialFunction
MaterialInstance
#UE4DD
Material Function
#UE4DD
様々なマテリアルで同様の機能を組むことに
MaterialA
MaterialB
MaterialC
#UE4DD
Material Functionマテリアルエディタで内で使用できる関数のノードを作成する
#UE4DD
Material Function で関数を共通化
MaterialA
MaterialB
MaterialC
参照
Material Function
#UE4DD
Material Instance
#UE4DD
マテリアルだけならば、テクスチャ差し替えやパラメータを変えるだけでも、別マテリアルを用意しなければいけない。
#UE4DD
Material Instance親マテリアルに設定されたパラメータなどを独自に設定 ( 上書き ) できるマテリアル
Material
MaterialInstance
MaterialInstance
#UE4DD
Material Instance親マテリアルに設定されたパラメータなどを独自に設定 ( 上書き ) できるマテリアル
Material
MaterialInstance
MaterialInstance
親のマテリアルにパラメータを追加
#UE4DD
Material Instance親マテリアルに設定されたパラメータなどを独自に設定 ( 上書き ) できる Material
Material
MaterialInstance
MaterialInstance
子のマテリアルにパラメータが出て上書き可能に
#UE4DD
乱立していたマテリアルが。。。
#UE4DD
一つのマスターマテリアル ( ベースマテリアル ) とそれが持つパラメータの上書きで表現可能に。
#UE4DD
Tips: Static Switch Parameter でマテリアルの処理を”静的に”切り替える事が可能。
Material
MaterialInstance
MaterialInstance
#UE4DD
Tips: Static Switch Parameter でマテリアルの処理を”静的に”切り替える事が可能。
Material
MaterialInstance
MaterialInstance
#UE4DD
Tips: マテリアルインスタンスはマテリアルインスタンスを親にできます。
Material
MaterialInstance
MaterialInstance
MaterialInstance
MaterialInstance
例 : マスターマテリアルのパラメータ・色・テクスチャ
#UE4DD
Tips: マテリアルインスタンスはマテリアルインスタンスを親にできます。
Material
MaterialInstance
MaterialInstance
MaterialInstance
MaterialInstance
子供 : Texture を指定孫 : 色を指定 色違いのオブジェクトやキャラクタなどに
#UE4DD
まとめ
#UE4DD
まとめ
Material
MaterialInstance
MaterialInstance
MaterialInstance
MaterialInstance
1. Material 間の共有機能は Material Function にまとめる
2. 適切なパラメータを Material から抽出しMaterial Instance を作成。Material の共通化を行う。(Switch パラメータでシェーダの挙動を静的に変更可能 )
MaterialMaterial FunctionMaterial FunctionMaterial 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…
MaterialCompressedShader Binary
…
sb
sb
sb
Material
4.13 4.14
#UE4DD
Loading Render
Memory
(4.14)
CompressedShader Binary
…
sb
sb
sb
Shader Binary
01001000…Decompress
Runtime (4.14)
HDD
Mat
使用される Shader だけ展開されるので、ロード時間、メモリどちらにもやさしい。
#UE4DD
4.14 からマテリアルのサイズがぐっと減ります。
4.13 4.14Material A 236kb 62kbMaterial 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 / RenderingShader Permutation Reduction
• プロジェクトで使わない機能を前もって指定することで、その機能のシェーダを生成しない
#UE4DD
OFF のままその機能を使うと警告が出る( レンダリングはされない )
Project Settings / RenderingShader Permutation Reduction
#UE4DD
このマテリアルで検証。(usage は static lighting のみ。 )
#UE4DD
全部つけたもの vs 全部消したもの25 17
シェーダ数を 32%削減
#UE4DD
Project Settings / RenderingShader Permutation Reduction
• 4つのオプションをそれぞれ見ていく。
#UE4DD
Shader Permutation ReductionSupport Stationary Skylight
#UE4DD
Shader Permutation ReductionSupport Stationary Skylight
消えるシェーダ
#UE4DD
Shader Permutation ReductionSupport low quality lightmap shader permutations
モバイル用ライトマップを使うか(Win や PS4/Xbox 開発だけならば使わない )
#UE4DD
Shader Permutation ReductionSupport low quality lightmap shader permutations
消えるシェーダ
#UE4DD
Shader Permutation ReductionSupport Atmospheric Fog
#UE4DD
Shader Permutation ReductionSupport Atmospheric Fog
消えるシェーダ
#UE4DD
Shader Permutation ReductionSupport Pointlight WholeSceneShadows
#UE4DD
Shader Permutation ReductionSupport 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 / RenderingShader 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ビールで乾杯 ;もう一杯 ;もう一杯 ;もう一杯 ;…もう一杯 ;
命令数 : 150杯ビール飲む ;
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…
MaterialCompressedShader 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 は何のデータを持つか
MaterialInstance
MaterialInstance
Material
#UE4DD
なので、 Material Instance のデータサイズは軽い
Material 30KBMaterial Instance 2KB
#UE4DD
しかし。。。マテリアルインスタンスがマテリアルのデータぐらい大きくなる場合がある。
Material 30KBMaterial Instance 30KB
#UE4DD
Shader Shader Shader Shader…
親と違う Shader を使わなければいけないとき、マテリアルインスタンスは独自のシェーダを保有する。
MaterialInstance
MaterialInstance
Shader Shader Shader ShaderMaterial …
親と別のシェーダが必要!
名前はマテリアルインスタンスだが、中身はほぼマテリアルと一緒
#UE4DD
どんなときに、マテリアルインスタンスは別のシェーダを持つのか?
#UE4DD
独自のシェーダを必要としない場合
• テクスチャ• 数値パラメータ
これらは別のシェーダを必要としない。
#UE4DD
マテリアルインスタンスが別シェーダを必要とするとき
1. Override properties2. Static Switch
Parameter3. Static Component Mask
Parameter
#UE4DD
マテリアルインスタンスが別シェーダを必要とするとき
1. Override properties2. Static Switch
Parameter3. Static Component Mask
Parameter
#UE4DD
マテリアルインスタンスが別シェーダを必要とするとき
1. Override properties2. Static Switch
Parameter3. Static Component Mask
Parameter
#UE4DD
マテリアルインスタンスが別シェーダを必要とするとき
1. Override properties2. Static Switch
Parameter3. Static Component Mask
Parameter
#UE4DD
上記オーバライドを行うと、シェーダの書き換えが必要なため、Material Instance もシェーダを持ちます。
MaterialInstance
MaterialInstance
Shader Shader Shader ShaderMaterial …
Shader Shader Shader Shader…
親と別のシェーダが必要!
#UE4DD
Inst Inst Inst
想像できる恐怖
全てのマテリアルインスタンスがそれぞれシェーダを持つ
Mat
#UE4DD
Tips: 孫のマテリアルインスタンス
MaterialInstance
MaterialInstance
MaterialInstance
Shader Shader Shader Shader…Material
Shader Shader Shader Shader…MaterialInstance
前述のオーバライドを行わなければ、親のシェーダを参照する。
#UE4DD
マテリアルインスタンスの組み方でサイズが変わる簡単な一例を。。
#UE4DD
パラメータは三つ1.) テクスチャ、 2) テクスチャ使用有無 , 3) 乗算される色
Material
MaterialInstance
MaterialInstance
#UE4DD
どちらがよいでしょうか?
MaterialInstance
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
ShaderShaderShaderShader
InstA
Switches
ShaderShaderShaderShader
InstB
Switches
ShaderShaderShaderShader
InstC
Switches
マテリアルインスタンスのシェーダコンパイルの流れ
同じスイッチの組み合わせならば、前のシェーダをコピーする
同じ組み合わせのシェーダコンパイルは一度しか起きない
#UE4DD
Loading
ShaderShaderShaderShader
InstA
Switches
ShaderShaderShaderShader
InstB
Switches
ShaderShaderShaderShader
InstC
Switches
マテリアルインスタンスのロードの流れ
#UE4DD
Loading
ShaderShaderShaderShader
InstA
Switches
ShaderShaderShaderShader
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…
MaterialCompressedShader 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 は何のデータを持つか
MaterialInstance
MaterialInstance
Material
#UE4DD
Shader Shader Shader Shader…
親と違う Shader を使わなければいけないとき、マテリアルインスタンスは独自のシェーダを保有する。
MaterialInstance
MaterialInstance
Shader Shader Shader ShaderMaterial …
親と別のシェーダが必要!
名前はマテリアルインスタンスだが、中身はほぼマテリアルと一緒
#UE4DD
マテリアルインスタンスが別シェーダを必要とするとき
1. Override properties2. Static Switch
Parameter3. 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