125.5K Views
January 23, 17
スライド概要
2017年1月21日に行われたライセンシー様向けマテリアル管理勉強会の資料です。(登壇者: Epic Games Japan 篠山範明)
マテリアルとマテリアルインスタンスの内部の仕組み(シェーダ保有の有無)と、それによって生じる落とし穴について説明しております。
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
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 2. 関連するマテリアルってどれ? Development 3. 終わらないShader Compile Runtime #UE4DD 1. 処理が重たい、メモリに乗らない。 パッケージサイズがでかすぎる。
マテリアル構成は、 管理のしやすさだけではなく、 Runtimeや日々のイテレーションも考慮した方が良い 開発後半の抜本的修正は非常に苦痛 #UE4DD
マテリアルが問題となる問題となる複数の視点 Management Development Runtime #UE4DD はじめに、 気をつけるべき点とその仕組みを Epic Gamesがご説明。
マテリアルが問題となる問題となる複数の視点 Management Development Runtime #UE4DD その後、実タイトルがどのように 実践しているかを、 バイキング様、 SQEX様に ご説明していただきます。
アジェンダ 1. 2. 3. 4. マテリアル開発の基本イメージ マテリアルとは? マテリアルインスタンスとは? まとめ #UE4DD
アジェンダ 1. 2. 3. 4. マテリアル開発の基本イメージ マテリアルとは? マテリアルインスタンスとは? まとめ #UE4DD
マテリアルをノードベースで作成できる。 #UE4DD
このマテリアル機能だけだと。。。 #UE4DD
テクスチャやパラメータ だけが違うマテリアル 同じ処理が様々な マテリアルに Material A Material B #UE4DD
共通項を抽出する2つの機能 同じ処理が様々な マテリアルに Material Function #UE4DD テクスチャやパラメータ だけが違うマテリアル Material Instance
Material #UE4DD Function
様々なマテリアルで同様の機能を 組むことに Material A Material B Material C #UE4DD
Material Function マテリアルエディタで内で使用できる関数のノードを 作成する #UE4DD
Material Functionで関数を共通化 Material Function Material A Material B Material C #UE4DD 参照
Material #UE4DD Instance
マテリアルだけならば、テクスチャ差し替えやパラメータを変 えるだけでも、別マテリアルを用意しなければいけない。 #UE4DD
Material Instance 親マテリアルに設定されたパラメータなどを 独自に設定(上書き)できるマテリアル Material Material Instance #UE4DD Material Instance
Material Instance 親マテリアルに設定されたパラメータなどを 独自に設定(上書き)できるマテリアル Material 親のマテリアルにパラメータを追加 Material Instance #UE4DD Material Instance
Material Instance 親マテリアルに設定されたパラメータなどを 独自に設定(上書き)できるMaterial Material Material Instance #UE4DD Material Instance 子のマテリアルにパラメータが出て 上書き可能に
乱立していたマテリアルが。。。 #UE4DD
一つのマスターマテリアル(ベースマテリアル)と それが持つパラメータの上書きで表現可能に。 #UE4DD
Tips: Static Switch Parameterで マテリアルの処理を”静的に”切り替える事が可能。 Material Material Instance #UE4DD Material Instance
Tips: Static Switch Parameterで マテリアルの処理を”静的に”切り替える事が可能。 Material Material Instance #UE4DD Material Instance
Tips: マテリアルインスタンスはマテリアルインスタンスを親にできます。 Material Material Instance Material Instance Material Instance #UE4DD Material Instance 例: マスターマテリアルのパラメータ ・色 ・テクスチャ
Tips: マテリアルインスタンスはマテリアルインスタンスを親にできます。 Material Material Instance Material Instance Material Instance #UE4DD Material Instance 子供: Textureを指定 孫 : 色を指定 色違いのオブジェクトやキャラクタなどに
まとめ #UE4DD
まとめ Material Function Material Material Function Material Material Function Material Instance Material Instance Material Instance #UE4DD Material Instance 1. Material間の共有機能は Material Functionにまとめる 2. 適切なパラメータをMaterialから抽出し Material Instanceを作成。 Materialの共通化を行う。 (Switch パラメータでシェーダの挙動を 静的に変更可能)
ここまでが基本的なイメージかと思います。 #UE4DD
では、どんな構成にしていくべきか? 一つの大きな マスターマテリアルから派生 複数のマスターマテリアルから インスタンスを都度作成。 Mat Mat Inst Inst Mat Mat Inst Inst Inst Inst Inst Inst 孫を許す? #UE4DD Inst
ということで、 マテリアルとマテリアルインスタンスについて もう少し深くみていきたいと思います。 #UE4DD
アジェンダ 1. 2. 3. 4. マテリアル開発の基本イメージ マテリアルとは? マテリアルインスタンスとは? まとめ #UE4DD
質問 1つのマテリアルを表現するために必要なシェーダは 何個でしょうか? #UE4DD
From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい 赤いポリゴンが一枚描画されるところをイメージします。 Color Buffer #UE4DD Depth Buffer
From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい 描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pixel Shader Color Buffer #UE4DD Depth Buffer
From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい 描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pixel Shader Color Buffer Depth Buffer 頂点シェーダで、画面のどこにポリゴンがあるかを計算します。 #UE4DD
From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい 描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pixel Shader Color Buffer Depth Buffer ラスタライザでそのポリゴンがどのピクセルを埋めるかを判断します。 #UE4DD
From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい 描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pixel Shader Color Buffer そしてPixel Shaderでピクセルの色を計算する #UE4DD Depth Buffer
Vertex Shader Material Pixel Shader 一つのオブジェクトをレンダリングするには 頂点シェーダとピクセルシェーダが必要。 ならば、少なくとも2つはシェーダが必要だ。 。。。2つだけ? #UE4DD
様々なオブジェクトの属性が、 様々なライティングをされます。 #UE4DD
一つのマテリアルでも。。。 #UE4DD
様々なオブジェクトにアサインして、 レンダリングすることができます。 ※マテリアルドメインが違うものはアサインできません。 例: ポストプロセス用マテリアルを、メッシュにアサインするなどはできない。 #UE4DD
これが可能なのは、 マテリアルは様々な場合に応じたシェーダを保持し、 それぞれの場合に応じて使用しているからです。 Material Shader #UE4DD Shader Shader Shader
よくある疑問。。 全部に対応できる高性能シェーダを 1つ作れば良いんじゃないの? Material Shader!! #UE4DD
シェーダは、 一度に沢山の頂点と沢山のピクセルを計算する Vertex Shader Pixel Shader Color Buffer #UE4DD Depth Buffer
シェーダの小さな負荷増減 -> GPUの処理負荷激増なことも Vertex Shader 頂点シェーダの負荷 × 頂点の数 Pixel Shader ピクセルシェーダの負荷 × ピクセルの数 #UE4DD
描画負荷を軽くするために、 シェーダはなるべくシンプルにする (これはもうそういうものだと思っていただければ。。。) #UE4DD
そのため、使用方法に応じたシェーダを 複数持つ必要があります。 Material Shader #UE4DD Shader Shader Shader
Tips: コンパイルされるシェーダソースを表示する r.DumpShaderDebugInfo Engine/Config/ConsoleVariables.ini #UE4DD
GAMEPROJECT/Saved/ShaderDebugInfo に、 シェーダが書き出されます。 #UE4DD
Materialのデータのメインは、 使われる複数のシェーダ Material Shader Binary 01001000… 01001000… … 01001000… ※非常にシンプルなシェーダは、予めエンジンが保有しており、それの参照のみ #UE4DD
これを意識しておかないと。。。 #UE4DD
1個で30MBのマテリアルに #UE4DD
終わらない Shader Compile #UE4DD
マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 #UE4DD
朗報 #UE4DD
UE4.14から、マテリアル内部の シェーダはそれぞれ圧縮されるようになります。 Material Material Shader Binary 01001000… 01001000… 4.13 #UE4DD Shader Binary sb sb … … 01001000… Compressed sb 4.14
(4.14) Runtime (4.14) Mat Compressed Shader Binary Shader Binary sb Loading sb 01001000… … Decompress Render sb HDD Memory 使用されるShaderだけ展開されるので、 ロード時間、メモリどちらにもやさしい。 #UE4DD
4.14からマテリアルのサイズがぐっと減ります。 4.13 Material A 236kb Material B 38KB 4.14 62kb 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 #UE4DD Shader Shader Shader
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にだけチェック = #UE4DD 97KB
不要なUsageがついてないか確認しましょう。 (残念ながら、全マテリアルのUsageを 自動でチェックする機能などは現状ありません。) #UE4DD
減らす方法二点 1. 不要なUsageを減らす 2. Shader Permutation Reduction #UE4DD
Usageとは別に、 ライティングやポスト処理の組み合わせに対応できるよう、 使用有無に関係なく前もって沢山のシェーダを持つ。 Material Shader #UE4DD Shader Shader Shader
Project Settings / Rendering Shader Permutation Reduction • プロジェクトで使わない機能を前もって指定す ることで、その機能のシェーダを生成しない #UE4DD
Project Settings / Rendering Shader Permutation Reduction OFFのままその機能を使うと警告が出る (レンダリングはされない) #UE4DD
このマテリアルで検証。 (usageはstatic lightingのみ。) #UE4DD
25 17 全部つけたもの vs 全部消したもの シェーダ数を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杯ビール飲む; 1行 50行 ※あくまでイメージです。コンパイラは賢く処理するし、実際にForLoopが1命令になるわけではありません。 #UE4DD
注意点 シェーダの命令数 ≠ シェーダの重たさ (Cycle数と言おうか。。) (大雑把に見れば=でもいいけど。。。) #UE4DD
シェーダの命令数とシェーダの重たさの違う例1 悪意をもってマテリアルを作ると。。。スフィアに貼り付けただけで、 39命令のシェーダでも、 20msの処理負荷に #UE4DD
シェーダの命令数とシェーダの重たさの違う例2 悪意をもってマテリアルを作ると。。。スフィアに貼り付けただけで、 2533命令のシェーダでも、 0.04msの処理負荷で済む。 #UE4DD
このように、 処理負荷は命令数だけでは厳密にはわかりません。 一番怖いのは、 効果の少ない最適化をしてしまうこと Statsを見て 必死に命令数を減らしても効果がないかもしれません。 ダメな例: テクスチャの参照回数がネックなのに、 キャラの重要な強調表現を端折る。 #UE4DD
GPUの処理負荷が気になる場合、 エンジニアにご相談を。 #UE4DD
マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 #UE4DD
マテリアルのまとめ #UE4DD
マテリアルの中には様々な用途に応じた シェーダが入っています。 Material Material Shader Binary 01001000… 01001000… 4.13 #UE4DD Shader Binary sb sb … … 01001000… Compressed sb 4.14
マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 #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
Material Instanceは何のデータを持つか Material Material Instance #UE4DD Shader Material Instance Shader Shader … 1. 参照するマテリアルはどれか? 2. 上書きするパラメータの値 Shader
なので、Material Instanceのデータサイズは軽い Material Material Instance #UE4DD 30KB 2KB
しかし。。。マテリアルインスタンスが マテリアルのデータぐらい大きくなる場合がある。 Material Material Instance #UE4DD 30KB 30KB
親と違うShaderを使わなければいけないとき、 マテリアルインスタンスは独自のシェーダを保有する。 Material Shader Shader Shader … Shader 親と別のシェーダが必要! Material Instance Material Instance Shader Shader Shader … Shader 名前はマテリアルインスタンスだが、中身はほぼマテリアルと一緒 #UE4DD
どんなときに、 マテリアルインスタンスは別のシェーダを持つのか? #UE4DD
独自のシェーダを必要としない場合 • テクスチャ • 数値パラメータ これらは別のシェーダを 必要としない。 #UE4DD
マテリアルインスタンスが 別シェーダを必要とするとき 1. 2. 3. Override properties Static Switch Parameter Static Component Mask Parameter #UE4DD
マテリアルインスタンスが 別シェーダを必要とするとき 1. Override properties 2. Static Switch Parameter 3. Static Component Mask Parameter #UE4DD
マテリアルインスタンスが 別シェーダを必要とするとき 1. 2. 3. Override properties Static Switch Parameter Static Component Mask Parameter #UE4DD
マテリアルインスタンスが 別シェーダを必要とするとき 1. 2. 3. Override properties Static Switch Parameter Static Component Mask Parameter #UE4DD
上記オーバライドを行うと、シェーダの書き換えが必要なため、 Material Instanceもシェーダを持ちます。 Material Shader Shader Shader … Shader 親と別のシェーダが必要! Material Instance #UE4DD Material Instance Shader Shader Shader … Shader
想像できる恐怖 全てのマテリアルインスタンスがそれぞれシェーダを持つ Mat Inst #UE4DD Inst Inst
Tips: 孫のマテリアルインスタンス Material Material Instance Material Instance Material Instance #UE4DD Shader Shader Shader Material Instance Shader Shader … Shader Shader … Shader 前述のオーバライドを行わなければ、 親のシェーダを参照する。
マテリアルインスタンスの組み方で サイズが変わる簡単な一例を。。 #UE4DD
パラメータは三つ 1.)テクスチャ、 2)テクスチャ使用有無, 3) 乗算される色 Material Material Instance #UE4DD Material Instance
どちらがよいでしょうか? Material Material Instance #UE4DD
どちらがよいでしょうか? 2 1 まず最初に色を変える。 switch switch switch switch その後に、UseTextureスイッチをOnに して、テクスチャをあてがう。 末端のマテリアルインスタンス4つがシェーダを持つ。 #UE4DD
どちらがよいでしょうか? 1 2 Use TextureスイッチをOnにして、 テクスチャをあてがう switch その後に色を変える。 子の2つがシェーダを持ち、孫の4つはシェーダを持たない。 #UE4DD switch
どちらがよいでしょうか? データサイズやロード時間を考えると,右の方が良い。 switch switch switch switch switch (赤で囲まれたマテリアルインスタンスがシェーダを持つ) #UE4DD switch
サイズやロードを加味したマテリアルインスタンスの構築 スイッチやプロパティのオーバライドは、 なるべく上位のインスタンスでやる。 Mat 上の方で スイッチを使う こうすれば その子供達は シェーダを持たない #UE4DD Inst Inst Inst
Switchを上の方で行えば左側の作り方でもOK? 一つの大きな マスターマテリアルから派生 複数のマスターマテリアルから インスタンスを都度作成。 Mat Mat Inst Inst Mat Mat Inst Inst Inst Inst Inst Inst 孫を許す? #UE4DD Inst
Tips マテリアルインスタンス VS 親マテリアルのUsage #UE4DD
Material の Usage項目 #UE4DD 再掲載
Tips: マテリアルインスタンスはUsageを持たない。 親のマテリアルのUsageをOnにする。 Material Inst #UE4DD Inst Inst Inst
一つの大きな マスターマテリアルから派生 はおすすめできない Mat Inst Inst Inst • 管理も難しく、 • 一つのシェーダ修正が 沢山のマテリアルインスタンスに影響し • 更にUsageが爆発するのでおすすめできない。 #UE4DD
一つの大きな マスターマテリアルから派生 複数のマスターマテリアルから インスタンスを都度作成。 Mat 程よく分散しましょう Inst Inst Mat Mat Inst Inst #UE4DD Mat Inst Inst Inst Inst Inst
アジェンダ 1. 2. 3. 4. マテリアル開発の基本イメージ マテリアルとは? マテリアルインスタンスとは? まとめ #UE4DD
Advanced シェーダを持つマテリアルインスタンス の コンパイルとメモリ展開 #UE4DD
みんながシェーダを持つとコンパイルも大変だし メモリがすぐ埋まってしまいそうだ。。。 Mat Inst #UE4DD Inst Inst
ShaderCompile 同じ組み合わせのシェーダコンパイルは一度しか起きない 同じスイッチの組み合わせならば、 前のシェーダをコピーする Shader InstA Shader Shader InstB Shader Switches Shader Shader Shader InstC Shader Switches Shader Shader Switches マテリアルインスタンスのシェーダコンパイルの流れ #UE4DD Shader Shader
Loading Shader InstA Shader Shader InstB Shader Switches Shader Shader Shader InstC Shader Switches Shader Shader Switches マテリアルインスタンスのロードの流れ #UE4DD Shader Shader
Loading 同一組み合わせのシェーダは一つのインスタンスのみ生き残る 自身のシェーダをメモリから消して、先のを参照する Shader InstA Shader Shader InstB Shader Switches Shader Shader InstC Shader Switches Shader Switches マテリアルインスタンスのロードの流れ #UE4DD
シェーダコンパイルやメモリに残る量は、 組み合わせの数以上は起きない。 Mat Inst #UE4DD Inst Inst
Advanced シェーダを持つマテリアルインスタンス の コンパイルとメモリ展開 おしまい #UE4DD
アジェンダ 1. 2. 3. 4. マテリアル開発の基本イメージ マテリアルとは? マテリアルインスタンスとは? まとめ #UE4DD
マテリアルが問題となる複数の視点 Management 誰が作るの? 命名規則は? どこに置くの? Development 日々の開発を効率的に、 イテレーションしやすく Runtime 処理が重たい、 メモリに乗らない。 #UE4DD
マテリアル #UE4DD
マテリアルの中には様々な用途に応じた シェーダが入っています。 Material Material Shader Binary 01001000… 01001000… 4.13 #UE4DD Shader Binary sb sb … … 01001000… Compressed sb 4.14
マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 #UE4DD
マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 対策 1. 不要な “Usage” の消去 2. Shader Permutation Reduction #UE4DD
マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 対策 1. 可能ならば、不要な計算式の除去 (命令数だけで最適化を進めるのは控えた方がよい) #UE4DD
マテリアルインスタンス #UE4DD
Material Instanceは何のデータを持つか Material Material Instance #UE4DD Shader Material Instance Shader Shader … 1. 参照するマテリアルはどれか? 2. 上書きするパラメータの値 Shader
親と違うShaderを使わなければいけないとき、 マテリアルインスタンスは独自のシェーダを保有する。 Material Shader Shader Shader … Shader 親と別のシェーダが必要! Material Instance Material Instance Shader Shader Shader … Shader 名前はマテリアルインスタンスだが、中身はほぼマテリアルと一緒 #UE4DD
マテリアルインスタンスが 別シェーダを必要とするとき 1. 2. 3. Override properties Static Switch Parameter Static Component Mask Parameter #UE4DD
サイズやロードを加味したマテリアルインスタンスの構築 スイッチやプロパティのオーバライドは、 なるべく上位のインスタンスでやり、 その下で単純なパラメータを編集する。 Mat 上の方で スイッチを使う こうすれば その子供達は シェーダを持たない #UE4DD Inst Inst Inst
Tips: マテリアルインスタンスはUsageを持たない。 親のマテリアルのUsageをOnにする。 Material Inst #UE4DD Inst Inst Inst
一つの大きな マスターマテリアルから派生 はおすすめできない Mat Inst Inst Inst • 管理も難しく、 • 一つのシェーダ修正が 沢山のマテリアルインスタンスに影響し • 更にUsageが爆発するのでおすすめできない。 #UE4DD
一つの大きな マスターマテリアルから派生 複数のマスターマテリアルから インスタンスを都度作成。 Mat 程よく分散しましょう Inst Inst Mat Mat Inst Inst #UE4DD Mat Inst Inst Inst Inst Inst
まとめ Management Development マテリアルとマテリアルインスタンスの データ構造から、 マテリアル構築時の注意点をみてきました。 ランタイムやコンパイル時間に影響するので、 開発後半で致命的にならないよう、 開発初期に、検討してみてください。 Runtime #UE4DD
まとめ Management Development Runtime #UE4DD Byking様、 SQEX大阪様の セッションへGO!
End #UE4DD