Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

27,510 views

Published on

2017年1月21日に行われたライセンシー様向けマテリアル管理勉強会の資料です。(登壇者: Epic Games Japan 篠山範明)

マテリアルとマテリアルインスタンスの内部の仕組み(シェーダ保有の有無)と、それによって生じる落とし穴について説明しております。

Published in: Engineering
  • Be the first to comment

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

  1. 1. #UE4DD Material管理の問題点と Material と Material Instanceの仕組み Epic Games Japan Nori Shinoyama
  2. 2. #UE4DD 備考 • 4.13 & 4.14 で基本的には検証 • PS4で計測 • 資料はすぐに公開されます
  3. 3. #UE4DD なぜMaterial管理を注意する必要があるか?
  4. 4. #UE4DD エディタで視覚的にマテリアルを作成することが可能 エンジニア以外も自由にマテリアルを作れる
  5. 5. #UE4DD マテリアルは大量につくられ、管理が大変になりがち。
  6. 6. #UE4DD マテリアルで問題となる複数の視点 Management 誰が作るの? 命名規則は? どこに置くの? Development 日々の開発を効率的に、 イテレーションしやすく Runtime 処理が重たい、 メモリに乗らない パッケージサイズでかすぎ
  7. 7. #UE4DD マテリアルワークフローの悪循環 Management Development Runtime 2. 関連するマテリアルってどれ? 3. 終わらないShader Compile 1. 処理が重たい、メモリに乗らない。 パッケージサイズがでかすぎる。
  8. 8. #UE4DD マテリアル構成は、 管理のしやすさだけではなく、 Runtimeや日々のイテレーションも考慮した方が良い 開発後半の抜本的修正は非常に苦痛
  9. 9. #UE4DD マテリアルが問題となる問題となる複数の視点 Management Development Runtime はじめに、 気をつけるべき点とその仕組みを Epic Gamesがご説明。
  10. 10. #UE4DD マテリアルが問題となる問題となる複数の視点 Management Development Runtime その後、実タイトルがどのように 実践しているかを、 バイキング様、 SQEX様に ご説明していただきます。
  11. 11. #UE4DD アジェンダ 1. マテリアル開発の基本イメージ 2. マテリアルとは? 3. マテリアルインスタンスとは? 4. まとめ
  12. 12. #UE4DD アジェンダ 1. マテリアル開発の基本イメージ 2. マテリアルとは? 3. マテリアルインスタンスとは? 4. まとめ
  13. 13. #UE4DD マテリアルをノードベースで作成できる。
  14. 14. #UE4DD このマテリアル機能だけだと。。。
  15. 15. #UE4DD Material A Material B 同じ処理が様々な マテリアルに テクスチャやパラメータ だけが違うマテリアル
  16. 16. #UE4DD 共通項を抽出する2つの機能 同じ処理が様々な マテリアルに テクスチャやパラメータ だけが違うマテリアル Material Function Material Instance
  17. 17. #UE4DD Material Function
  18. 18. #UE4DD 様々なマテリアルで同様の機能を 組むことに Material A Material B Material C
  19. 19. #UE4DD Material Function マテリアルエディタで内で使用できる関数のノードを 作成する
  20. 20. #UE4DD Material Functionで関数を共通化 Material A Material B Material C 参照 Material Function
  21. 21. #UE4DD Material Instance
  22. 22. #UE4DD マテリアルだけならば、テクスチャ差し替えやパラメータを変 えるだけでも、別マテリアルを用意しなければいけない。
  23. 23. #UE4DD Material Instance 親マテリアルに設定されたパラメータなどを 独自に設定(上書き)できるマテリアル Material Material Instance Material Instance
  24. 24. #UE4DD Material Instance 親マテリアルに設定されたパラメータなどを 独自に設定(上書き)できるマテリアル Material Material Instance Material Instance 親のマテリアルにパラメータを追加
  25. 25. #UE4DD Material Instance 親マテリアルに設定されたパラメータなどを 独自に設定(上書き)できるMaterial Material Material Instance Material Instance 子のマテリアルにパラメータが出て 上書き可能に
  26. 26. #UE4DD 乱立していたマテリアルが。。。
  27. 27. #UE4DD 一つのマスターマテリアル(ベースマテリアル)と それが持つパラメータの上書きで表現可能に。
  28. 28. #UE4DD Tips: Static Switch Parameterで マテリアルの処理を”静的に”切り替える事が可能。 Material Material Instance Material Instance
  29. 29. #UE4DD Tips: Static Switch Parameterで マテリアルの処理を”静的に”切り替える事が可能。 Material Material Instance Material Instance
  30. 30. #UE4DD Tips: マテリアルインスタンスはマテリアルインスタンスを親にできます。 Material Material Instance Material Instance Material Instance Material Instance 例: マスターマテリアルのパラメータ ・色 ・テクスチャ
  31. 31. #UE4DD Tips: マテリアルインスタンスはマテリアルインスタンスを親にできます。 Material Material Instance Material Instance Material Instance Material Instance 子供: Textureを指定 孫 : 色を指定 色違いのオブジェクトやキャラクタなどに
  32. 32. #UE4DD まとめ
  33. 33. #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
  34. 34. #UE4DD ここまでが基本的なイメージかと思います。
  35. 35. #UE4DD では、どんな構成にしていくべきか? Mat Inst Inst Inst Mat Inst Inst Mat Inst Inst Mat Inst Inst 一つの大きな マスターマテリアルから派生 複数のマスターマテリアルから インスタンスを都度作成。 孫を許す?
  36. 36. #UE4DD ということで、 マテリアルとマテリアルインスタンスについて もう少し深くみていきたいと思います。
  37. 37. #UE4DD アジェンダ 1. マテリアル開発の基本イメージ 2. マテリアルとは? 3. マテリアルインスタンスとは? 4. まとめ
  38. 38. #UE4DD 質問 1つのマテリアルを表現するために必要なシェーダは 何個でしょうか?
  39. 39. #UE4DD Color Buffer Depth Buffer 赤いポリゴンが一枚描画されるところをイメージします。 From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
  40. 40. #UE4DD 描画の流れをGPU的に追っていきます。 Color Buffer Depth Buffer Pixel Shader Rasterizer Vertex Shader From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
  41. 41. #UE4DD 描画の流れをGPU的に追っていきます。 Color Buffer Depth Buffer Pixel Shader Rasterizer Vertex Shader 頂点シェーダで、画面のどこにポリゴンがあるかを計算します。 From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
  42. 42. #UE4DD 描画の流れをGPU的に追っていきます。 Color Buffer Depth Buffer Pixel Shader Rasterizer Vertex Shader ラスタライザでそのポリゴンがどのピクセルを埋めるかを判断します。 From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
  43. 43. #UE4DD 描画の流れをGPU的に追っていきます。 Color Buffer Depth Buffer Pixel Shader Vertex Shader そしてPixel Shaderでピクセルの色を計算する Rasterizer From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
  44. 44. #UE4DD Pixel Shader Vertex Shader Material 一つのオブジェクトをレンダリングするには 頂点シェーダとピクセルシェーダが必要。 ならば、少なくとも2つはシェーダが必要だ。 。。。2つだけ?
  45. 45. #UE4DD 様々なオブジェクトの属性が、 様々なライティングをされます。
  46. 46. #UE4DD 一つのマテリアルでも。。。
  47. 47. #UE4DD 様々なオブジェクトにアサインして、 レンダリングすることができます。 ※マテリアルドメインが違うものはアサインできません。 例: ポストプロセス用マテリアルを、メッシュにアサインするなどはできない。
  48. 48. #UE4DD これが可能なのは、 マテリアルは様々な場合に応じたシェーダを保持し、 それぞれの場合に応じて使用しているからです。 Material Shader Shader Shader Shader
  49. 49. #UE4DD よくある疑問。。 Material Shader!! 全部に対応できる高性能シェーダを 1つ作れば良いんじゃないの?
  50. 50. #UE4DD Color Buffer Pixel Shader シェーダは、 一度に沢山の頂点と沢山のピクセルを計算する Vertex Shader Depth Buffer
  51. 51. #UE4DD Pixel Shader シェーダの小さな負荷増減 -> GPUの処理負荷激増なことも Vertex Shader 頂点シェーダの負荷 × 頂点の数 ピクセルシェーダの負荷 × ピクセルの数
  52. 52. #UE4DD 描画負荷を軽くするために、 シェーダはなるべくシンプルにする (これはもうそういうものだと思っていただければ。。。)
  53. 53. #UE4DD Material Shader Shader Shader Shader そのため、使用方法に応じたシェーダを 複数持つ必要があります。
  54. 54. #UE4DD Tips: コンパイルされるシェーダソースを表示する r.DumpShaderDebugInfo Engine/Config/ConsoleVariables.ini
  55. 55. #UE4DD GAMEPROJECT/Saved/ShaderDebugInfo に、 シェーダが書き出されます。
  56. 56. #UE4DD Materialのデータのメインは、 使われる複数のシェーダ Shader Binary … 01001000… 01001000… 01001000… Material ※非常にシンプルなシェーダは、予めエンジンが保有しており、それの参照のみ
  57. 57. #UE4DD これを意識しておかないと。。。
  58. 58. #UE4DD 1個で30MBのマテリアルに
  59. 59. #UE4DD 終わらない Shader Compile
  60. 60. #UE4DD マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数
  61. 61. #UE4DD 朗報
  62. 62. #UE4DD UE4.14から、マテリアル内部の シェーダはそれぞれ圧縮されるようになります。 Shader Binary … 01001000… 01001000… 01001000… Material Compressed Shader Binary … sb sb sb Material 4.13 4.14
  63. 63. #UE4DD Loading Render Memory (4.14) Compressed Shader Binary … sb sb sb Shader Binary 01001000… Decompress Runtime (4.14) HDD Mat 使用されるShaderだけ展開されるので、 ロード時間、メモリどちらにもやさしい。
  64. 64. #UE4DD 4.14からマテリアルのサイズがぐっと減ります。 4.13 4.14 Material A 236kb 62kb Material B 38KB 31Kb あるマテリアルのPS4用クックの比較
  65. 65. #UE4DD 備考 クックあとのuassetの場所。 GAMEPROJECT/Saved/Coocked/PLATOFORM_NAME/Content…
  66. 66. #UE4DD 4.14でサイズは改善されますが、 気にしなくていいサイズにはなっていません。 また、 この改善はシェーダコンパイル時間には影響しません
  67. 67. #UE4DD マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数
  68. 68. #UE4DD マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数
  69. 69. #UE4DD 悪意をもってシェーダの数を増やしてみる。 1個のマテリアルで240個のシェーダを保有
  70. 70. #UE4DD では、不要なシェーダを減らすために 何をすべきか?
  71. 71. #UE4DD 減らす方法二点 1. 不要なUsageを減らす 2. 4.13からのShader Permutation Reductionを 使う
  72. 72. #UE4DD 減らす方法二点 1. 不要なUsageを減らす 2. 4.13からのShader Permutation Reductionを 使う
  73. 73. #UE4DD 様々な”使用法” = “Usage”について、 それぞれ別にShaderを生成する。 Material Shader Shader Shader Shader
  74. 74. #UE4DD Material の Usage項目 このマテリアルが、 どの様なオブジェクトに アサインされているかを指定する。
  75. 75. #UE4DD Material の Usage項目
  76. 76. #UE4DD “Automatically Set Usage in Editor” オプション “Automatically Set Usage in Editor” (Default: ON) オブジェクトにアサインした際に、必要 なUsage項目に自動的にチェックを着け てくれる機能。 ※注意点: アサインを外したりオブジェクトを消し ても、自動的にOffになりません。
  77. 77. #UE4DD Usageがついてない場合、 Defaultマテリアルに差し替えられる。
  78. 78. #UE4DD サイズ比較 ありったけUsageにチェック = 1837KB Staticにだけチェック = 97KB
  79. 79. #UE4DD 不要なUsageがついてないか確認しましょう。 (残念ながら、全マテリアルのUsageを 自動でチェックする機能などは現状ありません。)
  80. 80. #UE4DD 減らす方法二点 1. 不要なUsageを減らす 2. Shader Permutation Reduction
  81. 81. #UE4DD Usageとは別に、 ライティングやポスト処理の組み合わせに対応できるよう、 使用有無に関係なく前もって沢山のシェーダを持つ。 Material Shader Shader Shader Shader
  82. 82. #UE4DD Project Settings / Rendering Shader Permutation Reduction • プロジェクトで使わない機能を前もって指定す ることで、その機能のシェーダを生成しない
  83. 83. #UE4DD OFFのままその機能を使うと警告が出る (レンダリングはされない) Project Settings / Rendering Shader Permutation Reduction
  84. 84. #UE4DD このマテリアルで検証。 (usageはstatic lightingのみ。)
  85. 85. #UE4DD 全部つけたもの vs 全部消したもの 25 17 シェーダ数を32%削減
  86. 86. #UE4DD Project Settings / Rendering Shader Permutation Reduction • 4つのオプションをそれぞれ見ていく。
  87. 87. #UE4DD Shader Permutation Reduction Support Stationary Skylight
  88. 88. #UE4DD Shader Permutation Reduction Support Stationary Skylight 消えるシェーダ
  89. 89. #UE4DD Shader Permutation Reduction Support low quality lightmap shader permutations モバイル用ライトマップを使うか (WinやPS4/Xbox開発だけならば使わない)
  90. 90. #UE4DD Shader Permutation Reduction Support low quality lightmap shader permutations 消えるシェーダ
  91. 91. #UE4DD Shader Permutation Reduction Support Atmospheric Fog
  92. 92. #UE4DD Shader Permutation Reduction Support Atmospheric Fog 消えるシェーダ
  93. 93. #UE4DD Shader Permutation Reduction Support Pointlight WholeSceneShadows
  94. 94. #UE4DD Shader Permutation Reduction Support Pointlight WholeSceneShadows • このオプション。。 – いまのところ、シェーダ削減は何もしていない。 – UE-40363として対応中。 • "Support PointLight WholeSceneShadows" option doesn't seem to reduce shader permutations
  95. 95. #UE4DD 4.15からMobile用 Shader Permutation Reductionも。
  96. 96. #UE4DD Project Settings / Rendering Shader Permutation Reduction • プロジェクトで使わない機能を前もって指定す ることで、その機能のシェーダを生成しない
  97. 97. #UE4DD シェーダの数を減らす方法二点 1. 不要なUsageを減らす 2. Shader Permutation Reduction
  98. 98. #UE4DD マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数
  99. 99. #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
  100. 100. #UE4DD 毎回バッチ叩いたり、 起動してキャプチャとったりは めんどくさい。。。
  101. 101. #UE4DD StatsのInstructionsの数と シェーダのサイズは相関があります
  102. 102. #UE4DD 命令数とマテリアルの相関 4.13 4.14 命令数: 30 38KB 31KB 命令数: 2500 236KB 62KB とあるマテリアルで計測 Usage: Static Lightingのみ Platform: PS4 (命令数はStatsの表示を記載)
  103. 103. #UE4DD じゃあ、どうすれば命令数を少なくできる? 正直、難しい。。。 不要な計算をしていないかなどの確認ぐらいか。。
  104. 104. #UE4DD もしも命令数を減らしたかったら。。 • 命令数が多いノードの使用を控える – Noise – POM – (他にもありそう。。要調査) • よく見られる不要なノード – Min / Max / Clamp – lerp
  105. 105. #UE4DD 番外編 シェーダ命令数は、 サイズよりも処理負荷の観点で見ることが多いので、 ここで、補足説明をしておきます。
  106. 106. #UE4DD 注意点 シェーダの命令数 ≠ シェーダの重たさ (大雑把に見れば=でもいいけど。。。) (Cycle数と言おうか。。)
  107. 107. #UE4DD 命令数と処理負荷の違い:1 1命令の重たさの違い パスワード変更しといて GDCでアテンドしてきて どちらも同じ1行(命令)だけれども、 タスク量(Cycle数)が違う。
  108. 108. #UE4DD 命令数と処理負荷の違い:2 同じシェーダでも処理負荷がランタイムで変わる コンパイラは賢い。 アルファテストのあるシェーダを アルファテスト -> 色と計算するようにしたりする。(Early Exit) 色の計算 アルファテスト透明部分の処理負荷 アルファテスト不透明部分の処理負荷
  109. 109. #UE4DD 命令数と処理負荷の違い:3 命令の仕方の違い 命令数: 50 ビールで乾杯; もう一杯; もう一杯; もう一杯; … もう一杯; 命令数: 1 50杯ビール飲む; 50行 1行 ※あくまでイメージです。コンパイラは賢く処理するし、実際にForLoopが1命令になるわけではありません。
  110. 110. #UE4DD 注意点 シェーダの命令数 ≠ シェーダの重たさ (大雑把に見れば=でもいいけど。。。) (Cycle数と言おうか。。)
  111. 111. #UE4DD シェーダの命令数とシェーダの重たさの違う例1 悪意をもってマテリアルを作ると。。。スフィアに貼り付けただけで、 39命令のシェーダでも、 20msの処理負荷に
  112. 112. #UE4DD シェーダの命令数とシェーダの重たさの違う例2 悪意をもってマテリアルを作ると。。。スフィアに貼り付けただけで、 2533命令のシェーダでも、 0.04msの処理負荷で済む。
  113. 113. #UE4DD このように、 処理負荷は命令数だけでは厳密にはわかりません。 一番怖いのは、 効果の少ない最適化をしてしまうこと Statsを見て 必死に命令数を減らしても効果がないかもしれません。 ダメな例: テクスチャの参照回数がネックなのに、 キャラの重要な強調表現を端折る。
  114. 114. #UE4DD GPUの処理負荷が気になる場合、 エンジニアにご相談を。
  115. 115. #UE4DD マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数
  116. 116. #UE4DD マテリアルのまとめ
  117. 117. #UE4DD マテリアルの中には様々な用途に応じた シェーダが入っています。 Shader Binary … 01001000… 01001000… 01001000… Material Compressed Shader Binary … sb sb sb Material 4.13 4.14
  118. 118. #UE4DD マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数
  119. 119. #UE4DD マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 対策 1. 不要な “Usage” の消去 2. Shader Permutation Reduction
  120. 120. #UE4DD マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 対策 1. 可能ならば、不要な計算式の除去 (命令数だけで最適化を進めるのは控えた方がよい)
  121. 121. #UE4DD 最後に、悪意をもってマテリアルを作ってみる • 可能なUsage全てをON • Shader Permutation Reductionを使わない • 命令数2500 • UE4.13 30MB超えマテリアルのできあがり。
  122. 122. #UE4DD アジェンダ 1. マテリアル開発の基本イメージ 2. マテリアルとは? 3. マテリアルインスタンスとは? 4. まとめ
  123. 123. #UE4DD 1. 参照するマテリアルはどれか? 2. 上書きするパラメータの値 Shader Shader Shader Shader… Material Instanceは何のデータを持つか Material Instance Material Instance Material
  124. 124. #UE4DD なので、Material Instanceのデータサイズは軽い Material 30KB Material Instance 2KB
  125. 125. #UE4DD しかし。。。マテリアルインスタンスが マテリアルのデータぐらい大きくなる場合がある。 Material 30KB Material Instance 30KB
  126. 126. #UE4DD Shader Shader Shader Shader… 親と違うShaderを使わなければいけないとき、 マテリアルインスタンスは独自のシェーダを保有する。 Material Instance Material Instance Shader Shader Shader ShaderMaterial … 親と別のシェーダが必要! 名前はマテリアルインスタンスだが、中身はほぼマテリアルと一緒
  127. 127. #UE4DD どんなときに、 マテリアルインスタンスは別のシェーダを持つのか?
  128. 128. #UE4DD 独自のシェーダを必要としない場合 • テクスチャ • 数値パラメータ これらは別のシェーダを 必要としない。
  129. 129. #UE4DD マテリアルインスタンスが 別シェーダを必要とするとき 1. Override properties 2. Static Switch Parameter 3. Static Component Mask Parameter
  130. 130. #UE4DD マテリアルインスタンスが 別シェーダを必要とするとき 1. Override properties 2. Static Switch Parameter 3. Static Component Mask Parameter
  131. 131. #UE4DD マテリアルインスタンスが 別シェーダを必要とするとき 1. Override properties 2. Static Switch Parameter 3. Static Component Mask Parameter
  132. 132. #UE4DD マテリアルインスタンスが 別シェーダを必要とするとき 1. Override properties 2. Static Switch Parameter 3. Static Component Mask Parameter
  133. 133. #UE4DD 上記オーバライドを行うと、シェーダの書き換えが必要なため、 Material Instanceもシェーダを持ちます。 Material Instance Material Instance Shader Shader Shader ShaderMaterial … Shader Shader Shader Shader… 親と別のシェーダが必要!
  134. 134. #UE4DD Inst Inst Inst 想像できる恐怖 全てのマテリアルインスタンスがそれぞれシェーダを持つ Mat
  135. 135. #UE4DD Tips: 孫のマテリアルインスタンス Material Instance Material Instance Material Instance Shader Shader Shader Shader…Material Shader Shader Shader Shader… Material Instance 前述のオーバライドを行わなければ、 親のシェーダを参照する。
  136. 136. #UE4DD マテリアルインスタンスの組み方で サイズが変わる簡単な一例を。。
  137. 137. #UE4DD パラメータは三つ 1.)テクスチャ、 2)テクスチャ使用有無, 3) 乗算される色 Material Material Instance Material Instance
  138. 138. #UE4DD どちらがよいでしょうか? Material Instance Material
  139. 139. #UE4DD どちらがよいでしょうか? switch switch switch switch まず最初に色を変える。 1 その後に、UseTextureスイッチをOnに して、テクスチャをあてがう。 2 末端のマテリアルインスタンス4つがシェーダを持つ。
  140. 140. #UE4DD どちらがよいでしょうか? 子の2つがシェーダを持ち、孫の4つはシェーダを持たない。 switch switch その後に色を変える。 2 Use TextureスイッチをOnにして、 テクスチャをあてがう 1
  141. 141. #UE4DD どちらがよいでしょうか? データサイズやロード時間を考えると,右の方が良い。 (赤で囲まれたマテリアルインスタンスがシェーダを持つ) switch switch switch switch switch switch
  142. 142. #UE4DD Inst Inst Inst サイズやロードを加味したマテリアルインスタンスの構築 スイッチやプロパティのオーバライドは、 なるべく上位のインスタンスでやる。 Mat こうすれば その子供達は シェーダを持たない 上の方で スイッチを使う
  143. 143. #UE4DD Switchを上の方で行えば左側の作り方でもOK? Mat Inst Inst Inst Mat Inst Inst Mat Inst Inst Mat Inst Inst 一つの大きな マスターマテリアルから派生 複数のマスターマテリアルから インスタンスを都度作成。 孫を許す?
  144. 144. #UE4DD Tips マテリアルインスタンス VS 親マテリアルのUsage
  145. 145. #UE4DD Material の Usage項目 再掲載
  146. 146. #UE4DD Tips: マテリアルインスタンスはUsageを持たない。 親のマテリアルのUsageをOnにする。 Material Inst Inst Inst Inst
  147. 147. #UE4DD Mat Inst Inst Inst 一つの大きな マスターマテリアルから派生 • 管理も難しく、 • 一つのシェーダ修正が 沢山のマテリアルインスタンスに影響し • 更にUsageが爆発するのでおすすめできない。 はおすすめできない
  148. 148. #UE4DD Mat Inst Inst Inst Mat Inst Inst Mat Inst Inst Mat Inst Inst 一つの大きな マスターマテリアルから派生 複数のマスターマテリアルから インスタンスを都度作成。 程よく分散しましょう
  149. 149. #UE4DD アジェンダ 1. マテリアル開発の基本イメージ 2. マテリアルとは? 3. マテリアルインスタンスとは? 4. まとめ
  150. 150. #UE4DD Advanced シェーダを持つマテリアルインスタンス の コンパイルとメモリ展開
  151. 151. #UE4DD Inst Inst Inst みんながシェーダを持つとコンパイルも大変だし メモリがすぐ埋まってしまいそうだ。。。 Mat
  152. 152. #UE4DD ShaderCompile Shader Shader Shader Shader InstA Switches Shader Shader Shader Shader InstB Switches Shader Shader Shader Shader InstC Switches マテリアルインスタンスのシェーダコンパイルの流れ 同じスイッチの組み合わせならば、 前のシェーダをコピーする 同じ組み合わせのシェーダコンパイルは一度しか起きない
  153. 153. #UE4DD Loading Shader Shader Shader Shader InstA Switches Shader Shader Shader Shader InstB Switches Shader Shader Shader Shader InstC Switches マテリアルインスタンスのロードの流れ
  154. 154. #UE4DD Loading Shader Shader Shader Shader InstA Switches Shader Shader Shader Shader InstB Switches InstC Switches 自身のシェーダをメモリから消して、先のを参照する マテリアルインスタンスのロードの流れ 同一組み合わせのシェーダは一つのインスタンスのみ生き残る
  155. 155. #UE4DD Inst Inst Inst シェーダコンパイルやメモリに残る量は、 組み合わせの数以上は起きない。 Mat
  156. 156. #UE4DD Advanced シェーダを持つマテリアルインスタンス の コンパイルとメモリ展開 おしまい
  157. 157. #UE4DD アジェンダ 1. マテリアル開発の基本イメージ 2. マテリアルとは? 3. マテリアルインスタンスとは? 4. まとめ
  158. 158. #UE4DD マテリアルが問題となる複数の視点 Management Development Runtime 誰が作るの? 命名規則は? どこに置くの? 日々の開発を効率的に、 イテレーションしやすく 処理が重たい、 メモリに乗らない。
  159. 159. #UE4DD マテリアル
  160. 160. #UE4DD マテリアルの中には様々な用途に応じた シェーダが入っています。 Shader Binary … 01001000… 01001000… 01001000… Material Compressed Shader Binary … sb sb sb Material 4.13 4.14
  161. 161. #UE4DD マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数
  162. 162. #UE4DD マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 対策 1. 不要な “Usage” の消去 2. Shader Permutation Reduction
  163. 163. #UE4DD マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 対策 1. 可能ならば、不要な計算式の除去 (命令数だけで最適化を進めるのは控えた方がよい)
  164. 164. #UE4DD マテリアルインスタンス
  165. 165. #UE4DD 1. 参照するマテリアルはどれか? 2. 上書きするパラメータの値 Shader Shader Shader Shader… Material Instanceは何のデータを持つか Material Instance Material Instance Material
  166. 166. #UE4DD Shader Shader Shader Shader… 親と違うShaderを使わなければいけないとき、 マテリアルインスタンスは独自のシェーダを保有する。 Material Instance Material Instance Shader Shader Shader ShaderMaterial … 親と別のシェーダが必要! 名前はマテリアルインスタンスだが、中身はほぼマテリアルと一緒
  167. 167. #UE4DD マテリアルインスタンスが 別シェーダを必要とするとき 1. Override properties 2. Static Switch Parameter 3. Static Component Mask Parameter
  168. 168. #UE4DD Inst Inst Inst サイズやロードを加味したマテリアルインスタンスの構築 スイッチやプロパティのオーバライドは、 なるべく上位のインスタンスでやり、 その下で単純なパラメータを編集する。 Mat こうすれば その子供達は シェーダを持たない 上の方で スイッチを使う
  169. 169. #UE4DD Tips: マテリアルインスタンスはUsageを持たない。 親のマテリアルのUsageをOnにする。 Material Inst Inst Inst Inst
  170. 170. #UE4DD Mat Inst Inst Inst 一つの大きな マスターマテリアルから派生 • 管理も難しく、 • 一つのシェーダ修正が 沢山のマテリアルインスタンスに影響し • 更にUsageが爆発するのでおすすめできない。 はおすすめできない
  171. 171. #UE4DD Mat Inst Inst Inst Mat Inst Inst Mat Inst Inst Mat Inst Inst 一つの大きな マスターマテリアルから派生 複数のマスターマテリアルから インスタンスを都度作成。 程よく分散しましょう
  172. 172. #UE4DD まとめ Management Development Runtime マテリアルとマテリアルインスタンスの データ構造から、 マテリアル構築時の注意点をみてきました。 ランタイムやコンパイル時間に影響するので、 開発後半で致命的にならないよう、 開発初期に、検討してみてください。
  173. 173. #UE4DD まとめ Management Development Runtime Byking様、 SQEX大阪様の セッションへGO!
  174. 174. #UE4DD End

×