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

84.2K Views

January 23, 17

スライド概要

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

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

profile-image

Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Material管理の問題点と Material と Material Instanceの仕組み Epic Games Japan Nori Shinoyama #UE4DD

2.

備考 • 4.13 & 4.14 で基本的には検証 • PS4で計測 • 資料はすぐに公開されます #UE4DD

3.

なぜMaterial管理を注意する必要があるか? #UE4DD

4.

エディタで視覚的にマテリアルを作成することが可能 エンジニア以外も自由にマテリアルを作れる #UE4DD

5.

マテリアルは大量につくられ、管理が大変になりがち。 #UE4DD

6.

マテリアルで問題となる複数の視点 Management 誰が作るの? 命名規則は? どこに置くの? Development 日々の開発を効率的に、 イテレーションしやすく Runtime 処理が重たい、 メモリに乗らない パッケージサイズでかすぎ #UE4DD

7.

マテリアルワークフローの悪循環 Management 2. 関連するマテリアルってどれ? Development 3. 終わらないShader Compile Runtime #UE4DD 1. 処理が重たい、メモリに乗らない。 パッケージサイズがでかすぎる。

8.

マテリアル構成は、 管理のしやすさだけではなく、 Runtimeや日々のイテレーションも考慮した方が良い 開発後半の抜本的修正は非常に苦痛 #UE4DD

9.

マテリアルが問題となる問題となる複数の視点 Management Development Runtime #UE4DD はじめに、 気をつけるべき点とその仕組みを Epic Gamesがご説明。

10.

マテリアルが問題となる問題となる複数の視点 Management Development Runtime #UE4DD その後、実タイトルがどのように 実践しているかを、 バイキング様、 SQEX様に ご説明していただきます。

11.

アジェンダ 1. 2. 3. 4. マテリアル開発の基本イメージ マテリアルとは? マテリアルインスタンスとは? まとめ #UE4DD

12.

アジェンダ 1. 2. 3. 4. マテリアル開発の基本イメージ マテリアルとは? マテリアルインスタンスとは? まとめ #UE4DD

13.

マテリアルをノードベースで作成できる。 #UE4DD

14.

このマテリアル機能だけだと。。。 #UE4DD

15.

テクスチャやパラメータ だけが違うマテリアル 同じ処理が様々な マテリアルに Material A Material B #UE4DD

16.

共通項を抽出する2つの機能 同じ処理が様々な マテリアルに Material Function #UE4DD テクスチャやパラメータ だけが違うマテリアル Material Instance

17.

Material #UE4DD Function

18.

様々なマテリアルで同様の機能を 組むことに Material A Material B Material C #UE4DD

19.

Material Function マテリアルエディタで内で使用できる関数のノードを 作成する #UE4DD

20.

Material Functionで関数を共通化 Material Function Material A Material B Material C #UE4DD 参照

21.

Material #UE4DD Instance

22.

マテリアルだけならば、テクスチャ差し替えやパラメータを変 えるだけでも、別マテリアルを用意しなければいけない。 #UE4DD

23.

Material Instance 親マテリアルに設定されたパラメータなどを 独自に設定(上書き)できるマテリアル Material Material Instance #UE4DD Material Instance

24.

Material Instance 親マテリアルに設定されたパラメータなどを 独自に設定(上書き)できるマテリアル Material 親のマテリアルにパラメータを追加 Material Instance #UE4DD Material Instance

25.

Material Instance 親マテリアルに設定されたパラメータなどを 独自に設定(上書き)できるMaterial Material Material Instance #UE4DD Material Instance 子のマテリアルにパラメータが出て 上書き可能に

26.

乱立していたマテリアルが。。。 #UE4DD

27.

一つのマスターマテリアル(ベースマテリアル)と それが持つパラメータの上書きで表現可能に。 #UE4DD

28.

Tips: Static Switch Parameterで マテリアルの処理を”静的に”切り替える事が可能。 Material Material Instance #UE4DD Material Instance

29.

Tips: Static Switch Parameterで マテリアルの処理を”静的に”切り替える事が可能。 Material Material Instance #UE4DD Material Instance

30.

Tips: マテリアルインスタンスはマテリアルインスタンスを親にできます。 Material Material Instance Material Instance Material Instance #UE4DD Material Instance 例: マスターマテリアルのパラメータ ・色 ・テクスチャ

31.

Tips: マテリアルインスタンスはマテリアルインスタンスを親にできます。 Material Material Instance Material Instance Material Instance #UE4DD Material Instance 子供: Textureを指定 孫 : 色を指定 色違いのオブジェクトやキャラクタなどに

32.

まとめ #UE4DD

33.

まとめ 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 パラメータでシェーダの挙動を 静的に変更可能)

34.

ここまでが基本的なイメージかと思います。 #UE4DD

35.

では、どんな構成にしていくべきか? 一つの大きな マスターマテリアルから派生 複数のマスターマテリアルから インスタンスを都度作成。 Mat Mat Inst Inst Mat Mat Inst Inst Inst Inst Inst Inst 孫を許す? #UE4DD Inst

36.

ということで、 マテリアルとマテリアルインスタンスについて もう少し深くみていきたいと思います。 #UE4DD

37.

アジェンダ 1. 2. 3. 4. マテリアル開発の基本イメージ マテリアルとは? マテリアルインスタンスとは? まとめ #UE4DD

38.

質問 1つのマテリアルを表現するために必要なシェーダは 何個でしょうか? #UE4DD

39.

From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい 赤いポリゴンが一枚描画されるところをイメージします。 Color Buffer #UE4DD Depth Buffer

40.

From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい 描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pixel Shader Color Buffer #UE4DD Depth Buffer

41.

From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい 描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pixel Shader Color Buffer Depth Buffer 頂点シェーダで、画面のどこにポリゴンがあるかを計算します。 #UE4DD

42.

From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい 描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pixel Shader Color Buffer Depth Buffer ラスタライザでそのポリゴンがどのピクセルを埋めるかを判断します。 #UE4DD

43.

From CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい 描画の流れをGPU的に追っていきます。 Vertex Shader Rasterizer Pixel Shader Color Buffer そしてPixel Shaderでピクセルの色を計算する #UE4DD Depth Buffer

44.

Vertex Shader Material Pixel Shader 一つのオブジェクトをレンダリングするには 頂点シェーダとピクセルシェーダが必要。 ならば、少なくとも2つはシェーダが必要だ。 。。。2つだけ? #UE4DD

45.

様々なオブジェクトの属性が、 様々なライティングをされます。 #UE4DD

46.

一つのマテリアルでも。。。 #UE4DD

47.

様々なオブジェクトにアサインして、 レンダリングすることができます。 ※マテリアルドメインが違うものはアサインできません。 例: ポストプロセス用マテリアルを、メッシュにアサインするなどはできない。 #UE4DD

48.

これが可能なのは、 マテリアルは様々な場合に応じたシェーダを保持し、 それぞれの場合に応じて使用しているからです。 Material Shader #UE4DD Shader Shader Shader

49.

よくある疑問。。 全部に対応できる高性能シェーダを 1つ作れば良いんじゃないの? Material Shader!! #UE4DD

50.

シェーダは、 一度に沢山の頂点と沢山のピクセルを計算する Vertex Shader Pixel Shader Color Buffer #UE4DD Depth Buffer

51.

シェーダの小さな負荷増減 -> GPUの処理負荷激増なことも Vertex Shader 頂点シェーダの負荷 × 頂点の数 Pixel Shader ピクセルシェーダの負荷 × ピクセルの数 #UE4DD

52.

描画負荷を軽くするために、 シェーダはなるべくシンプルにする (これはもうそういうものだと思っていただければ。。。) #UE4DD

53.

そのため、使用方法に応じたシェーダを 複数持つ必要があります。 Material Shader #UE4DD Shader Shader Shader

54.

Tips: コンパイルされるシェーダソースを表示する r.DumpShaderDebugInfo Engine/Config/ConsoleVariables.ini #UE4DD

55.

GAMEPROJECT/Saved/ShaderDebugInfo に、 シェーダが書き出されます。 #UE4DD

56.

Materialのデータのメインは、 使われる複数のシェーダ Material Shader Binary 01001000… 01001000… … 01001000… ※非常にシンプルなシェーダは、予めエンジンが保有しており、それの参照のみ #UE4DD

57.

これを意識しておかないと。。。 #UE4DD

58.

1個で30MBのマテリアルに #UE4DD

59.

終わらない Shader Compile #UE4DD

60.

マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 #UE4DD

61.

朗報 #UE4DD

62.

UE4.14から、マテリアル内部の シェーダはそれぞれ圧縮されるようになります。 Material Material Shader Binary 01001000… 01001000… 4.13 #UE4DD Shader Binary sb sb … … 01001000… Compressed sb 4.14

63.

(4.14) Runtime (4.14) Mat Compressed Shader Binary Shader Binary sb Loading sb 01001000… … Decompress Render sb HDD Memory 使用されるShaderだけ展開されるので、 ロード時間、メモリどちらにもやさしい。 #UE4DD

64.

4.14からマテリアルのサイズがぐっと減ります。 4.13 Material A 236kb Material B 38KB 4.14 62kb 31Kb あるマテリアルのPS4用クックの比較 #UE4DD

65.

備考 クックあとのuassetの場所。 GAMEPROJECT/Saved/Coocked/PLATOFORM_NAME/Content… #UE4DD

66.

4.14でサイズは改善されますが、 気にしなくていいサイズにはなっていません。 また、 この改善はシェーダコンパイル時間には影響しません #UE4DD

67.

マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 #UE4DD

68.

マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 #UE4DD

69.

悪意をもってシェーダの数を増やしてみる。 1個のマテリアルで240個のシェーダを保有 #UE4DD

70.

では、不要なシェーダを減らすために 何をすべきか? #UE4DD

71.

減らす方法二点 1. 不要なUsageを減らす 2. 4.13からのShader Permutation Reductionを 使う #UE4DD

72.

減らす方法二点 1. 不要なUsageを減らす 2. 4.13からのShader Permutation Reductionを 使う #UE4DD

73.

様々な”使用法” = “Usage”について、 それぞれ別にShaderを生成する。 Material Shader #UE4DD Shader Shader Shader

74.

Material の Usage項目 このマテリアルが、 どの様なオブジェクトに アサインされているかを指定する。 #UE4DD

75.

Material の Usage項目 #UE4DD

76.

“Automatically Set Usage in Editor” オプション “Automatically Set Usage in Editor” (Default: ON) オブジェクトにアサインした際に、必要 なUsage項目に自動的にチェックを着け てくれる機能。 ※注意点: アサインを外したりオブジェクトを消し ても、自動的にOffになりません。 #UE4DD

77.

Usageがついてない場合、 Defaultマテリアルに差し替えられる。 #UE4DD

78.

サイズ比較 ありったけUsageにチェック = 1837KB Staticにだけチェック = #UE4DD 97KB

79.

不要なUsageがついてないか確認しましょう。 (残念ながら、全マテリアルのUsageを 自動でチェックする機能などは現状ありません。) #UE4DD

80.

減らす方法二点 1. 不要なUsageを減らす 2. Shader Permutation Reduction #UE4DD

81.

Usageとは別に、 ライティングやポスト処理の組み合わせに対応できるよう、 使用有無に関係なく前もって沢山のシェーダを持つ。 Material Shader #UE4DD Shader Shader Shader

82.

Project Settings / Rendering Shader Permutation Reduction • プロジェクトで使わない機能を前もって指定す ることで、その機能のシェーダを生成しない #UE4DD

83.

Project Settings / Rendering Shader Permutation Reduction OFFのままその機能を使うと警告が出る (レンダリングはされない) #UE4DD

84.

このマテリアルで検証。 (usageはstatic lightingのみ。) #UE4DD

85.

25 17 全部つけたもの vs 全部消したもの シェーダ数を32%削減 #UE4DD

86.

Project Settings / Rendering Shader Permutation Reduction • 4つのオプションをそれぞれ見ていく。 #UE4DD

87.

Shader Permutation Reduction Support Stationary Skylight #UE4DD

88.

Shader Permutation Reduction Support Stationary Skylight 消えるシェーダ #UE4DD

89.

Shader Permutation Reduction Support low quality lightmap shader permutations モバイル用ライトマップを使うか (WinやPS4/Xbox開発だけならば使わない) #UE4DD

90.

Shader Permutation Reduction Support low quality lightmap shader permutations 消えるシェーダ #UE4DD

91.

Shader Permutation Reduction Support Atmospheric Fog #UE4DD

92.

Shader Permutation Reduction Support Atmospheric Fog 消えるシェーダ #UE4DD

93.

Shader Permutation Reduction Support Pointlight WholeSceneShadows #UE4DD

94.

Shader Permutation Reduction Support Pointlight WholeSceneShadows • このオプション。。 – いまのところ、シェーダ削減は何もしていない。 – UE-40363として対応中。 • "Support PointLight WholeSceneShadows" option doesn't seem to reduce shader permutations #UE4DD

95.

4.15からMobile用 Shader Permutation Reductionも。 #UE4DD

96.

Project Settings / Rendering Shader Permutation Reduction • プロジェクトで使わない機能を前もって指定す ることで、その機能のシェーダを生成しない #UE4DD

97.

シェーダの数を減らす方法二点 1. 不要なUsageを減らす 2. Shader Permutation Reduction #UE4DD

98.

マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 #UE4DD

99.

シェーダサイズの調べ方 • コンソールの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

100.

毎回バッチ叩いたり、 起動してキャプチャとったりは めんどくさい。。。 #UE4DD

101.

StatsのInstructionsの数と シェーダのサイズは相関があります #UE4DD

102.

命令数とマテリアルの相関 4.13 4.14 命令数: 30 38KB 31KB 命令数: 2500 236KB 62KB とあるマテリアルで計測 Usage: Static Lightingのみ Platform: PS4 (命令数はStatsの表示を記載) #UE4DD

103.

じゃあ、どうすれば命令数を少なくできる? 正直、難しい。。。 不要な計算をしていないかなどの確認ぐらいか。。 #UE4DD

104.

もしも命令数を減らしたかったら。。 • 命令数が多いノードの使用を控える – Noise – POM – (他にもありそう。。要調査) • よく見られる不要なノード – Min / Max / Clamp – lerp #UE4DD

105.

番外編 シェーダ命令数は、 サイズよりも処理負荷の観点で見ることが多いので、 ここで、補足説明をしておきます。 #UE4DD

106.

注意点 シェーダの命令数 ≠ シェーダの重たさ (Cycle数と言おうか。。) (大雑把に見れば=でもいいけど。。。) #UE4DD

107.

命令数と処理負荷の違い:1 1命令の重たさの違い パスワード変更しといて GDCでアテンドしてきて どちらも同じ1行(命令)だけれども、 タスク量(Cycle数)が違う。 #UE4DD

108.

命令数と処理負荷の違い:2 同じシェーダでも処理負荷がランタイムで変わる コンパイラは賢い。 アルファテストのあるシェーダを アルファテスト -> 色と計算するようにしたりする。(Early Exit) 透明部分の処理負荷 アルファテスト 不透明部分の処理負荷 アルファテスト #UE4DD 色の計算

109.

命令数と処理負荷の違い:3 命令の仕方の違い 命令数: 50 ビールで乾杯; もう一杯; もう一杯; もう一杯; … もう一杯; 命令数: 1 50杯ビール飲む; 1行 50行 ※あくまでイメージです。コンパイラは賢く処理するし、実際にForLoopが1命令になるわけではありません。 #UE4DD

110.

注意点 シェーダの命令数 ≠ シェーダの重たさ (Cycle数と言おうか。。) (大雑把に見れば=でもいいけど。。。) #UE4DD

111.

シェーダの命令数とシェーダの重たさの違う例1 悪意をもってマテリアルを作ると。。。スフィアに貼り付けただけで、 39命令のシェーダでも、 20msの処理負荷に #UE4DD

112.

シェーダの命令数とシェーダの重たさの違う例2 悪意をもってマテリアルを作ると。。。スフィアに貼り付けただけで、 2533命令のシェーダでも、 0.04msの処理負荷で済む。 #UE4DD

113.

このように、 処理負荷は命令数だけでは厳密にはわかりません。 一番怖いのは、 効果の少ない最適化をしてしまうこと Statsを見て 必死に命令数を減らしても効果がないかもしれません。 ダメな例: テクスチャの参照回数がネックなのに、 キャラの重要な強調表現を端折る。 #UE4DD

114.

GPUの処理負荷が気になる場合、 エンジニアにご相談を。 #UE4DD

115.

マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 #UE4DD

116.

マテリアルのまとめ #UE4DD

117.

マテリアルの中には様々な用途に応じた シェーダが入っています。 Material Material Shader Binary 01001000… 01001000… 4.13 #UE4DD Shader Binary sb sb … … 01001000… Compressed sb 4.14

118.

マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 #UE4DD

119.

マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 対策 1. 不要な “Usage” の消去 2. Shader Permutation Reduction #UE4DD

120.

マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 対策 1. 可能ならば、不要な計算式の除去 (命令数だけで最適化を進めるのは控えた方がよい) #UE4DD

121.

最後に、悪意をもってマテリアルを作ってみる • • • • 可能なUsage全てをON Shader Permutation Reductionを使わない 命令数2500 UE4.13 30MB超えマテリアルのできあがり。 #UE4DD

122.

アジェンダ 1. 2. 3. 4. マテリアル開発の基本イメージ マテリアルとは? マテリアルインスタンスとは? まとめ #UE4DD

123.

Material Instanceは何のデータを持つか Material Material Instance #UE4DD Shader Material Instance Shader Shader … 1. 参照するマテリアルはどれか? 2. 上書きするパラメータの値 Shader

124.

なので、Material Instanceのデータサイズは軽い Material Material Instance #UE4DD 30KB 2KB

125.

しかし。。。マテリアルインスタンスが マテリアルのデータぐらい大きくなる場合がある。 Material Material Instance #UE4DD 30KB 30KB

126.

親と違うShaderを使わなければいけないとき、 マテリアルインスタンスは独自のシェーダを保有する。 Material Shader Shader Shader … Shader 親と別のシェーダが必要! Material Instance Material Instance Shader Shader Shader … Shader 名前はマテリアルインスタンスだが、中身はほぼマテリアルと一緒 #UE4DD

127.

どんなときに、 マテリアルインスタンスは別のシェーダを持つのか? #UE4DD

128.

独自のシェーダを必要としない場合 • テクスチャ • 数値パラメータ これらは別のシェーダを 必要としない。 #UE4DD

129.

マテリアルインスタンスが 別シェーダを必要とするとき 1. 2. 3. Override properties Static Switch Parameter Static Component Mask Parameter #UE4DD

130.

マテリアルインスタンスが 別シェーダを必要とするとき 1. Override properties 2. Static Switch Parameter 3. Static Component Mask Parameter #UE4DD

131.

マテリアルインスタンスが 別シェーダを必要とするとき 1. 2. 3. Override properties Static Switch Parameter Static Component Mask Parameter #UE4DD

132.

マテリアルインスタンスが 別シェーダを必要とするとき 1. 2. 3. Override properties Static Switch Parameter Static Component Mask Parameter #UE4DD

133.

上記オーバライドを行うと、シェーダの書き換えが必要なため、 Material Instanceもシェーダを持ちます。 Material Shader Shader Shader … Shader 親と別のシェーダが必要! Material Instance #UE4DD Material Instance Shader Shader Shader … Shader

134.

想像できる恐怖 全てのマテリアルインスタンスがそれぞれシェーダを持つ Mat Inst #UE4DD Inst Inst

135.

Tips: 孫のマテリアルインスタンス Material Material Instance Material Instance Material Instance #UE4DD Shader Shader Shader Material Instance Shader Shader … Shader Shader … Shader 前述のオーバライドを行わなければ、 親のシェーダを参照する。

136.

マテリアルインスタンスの組み方で サイズが変わる簡単な一例を。。 #UE4DD

137.

パラメータは三つ 1.)テクスチャ、 2)テクスチャ使用有無, 3) 乗算される色 Material Material Instance #UE4DD Material Instance

138.

どちらがよいでしょうか? Material Material Instance #UE4DD

139.

どちらがよいでしょうか? 2 1 まず最初に色を変える。 switch switch switch switch その後に、UseTextureスイッチをOnに して、テクスチャをあてがう。 末端のマテリアルインスタンス4つがシェーダを持つ。 #UE4DD

140.

どちらがよいでしょうか? 1 2 Use TextureスイッチをOnにして、 テクスチャをあてがう switch その後に色を変える。 子の2つがシェーダを持ち、孫の4つはシェーダを持たない。 #UE4DD switch

141.

どちらがよいでしょうか? データサイズやロード時間を考えると,右の方が良い。 switch switch switch switch switch (赤で囲まれたマテリアルインスタンスがシェーダを持つ) #UE4DD switch

142.

サイズやロードを加味したマテリアルインスタンスの構築 スイッチやプロパティのオーバライドは、 なるべく上位のインスタンスでやる。 Mat 上の方で スイッチを使う こうすれば その子供達は シェーダを持たない #UE4DD Inst Inst Inst

143.

Switchを上の方で行えば左側の作り方でもOK? 一つの大きな マスターマテリアルから派生 複数のマスターマテリアルから インスタンスを都度作成。 Mat Mat Inst Inst Mat Mat Inst Inst Inst Inst Inst Inst 孫を許す? #UE4DD Inst

144.

Tips マテリアルインスタンス VS 親マテリアルのUsage #UE4DD

145.

Material の Usage項目 #UE4DD 再掲載

146.

Tips: マテリアルインスタンスはUsageを持たない。 親のマテリアルのUsageをOnにする。 Material Inst #UE4DD Inst Inst Inst

147.

一つの大きな マスターマテリアルから派生 はおすすめできない Mat Inst Inst Inst • 管理も難しく、 • 一つのシェーダ修正が 沢山のマテリアルインスタンスに影響し • 更にUsageが爆発するのでおすすめできない。 #UE4DD

148.

一つの大きな マスターマテリアルから派生 複数のマスターマテリアルから インスタンスを都度作成。 Mat 程よく分散しましょう Inst Inst Mat Mat Inst Inst #UE4DD Mat Inst Inst Inst Inst Inst

149.

アジェンダ 1. 2. 3. 4. マテリアル開発の基本イメージ マテリアルとは? マテリアルインスタンスとは? まとめ #UE4DD

150.

Advanced シェーダを持つマテリアルインスタンス の コンパイルとメモリ展開 #UE4DD

151.

みんながシェーダを持つとコンパイルも大変だし メモリがすぐ埋まってしまいそうだ。。。 Mat Inst #UE4DD Inst Inst

152.

ShaderCompile 同じ組み合わせのシェーダコンパイルは一度しか起きない 同じスイッチの組み合わせならば、 前のシェーダをコピーする Shader InstA Shader Shader InstB Shader Switches Shader Shader Shader InstC Shader Switches Shader Shader Switches マテリアルインスタンスのシェーダコンパイルの流れ #UE4DD Shader Shader

153.

Loading Shader InstA Shader Shader InstB Shader Switches Shader Shader Shader InstC Shader Switches Shader Shader Switches マテリアルインスタンスのロードの流れ #UE4DD Shader Shader

154.

Loading 同一組み合わせのシェーダは一つのインスタンスのみ生き残る 自身のシェーダをメモリから消して、先のを参照する Shader InstA Shader Shader InstB Shader Switches Shader Shader InstC Shader Switches Shader Switches マテリアルインスタンスのロードの流れ #UE4DD

155.

シェーダコンパイルやメモリに残る量は、 組み合わせの数以上は起きない。 Mat Inst #UE4DD Inst Inst

156.

Advanced シェーダを持つマテリアルインスタンス の コンパイルとメモリ展開 おしまい #UE4DD

157.

アジェンダ 1. 2. 3. 4. マテリアル開発の基本イメージ マテリアルとは? マテリアルインスタンスとは? まとめ #UE4DD

158.

マテリアルが問題となる複数の視点 Management 誰が作るの? 命名規則は? どこに置くの? Development 日々の開発を効率的に、 イテレーションしやすく Runtime 処理が重たい、 メモリに乗らない。 #UE4DD

159.

マテリアル #UE4DD

160.

マテリアルの中には様々な用途に応じた シェーダが入っています。 Material Material Shader Binary 01001000… 01001000… 4.13 #UE4DD Shader Binary sb sb … … 01001000… Compressed sb 4.14

161.

マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 #UE4DD

162.

マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 対策 1. 不要な “Usage” の消去 2. Shader Permutation Reduction #UE4DD

163.

マテリアルのサイズ&コンパイル時間増加の原因 シェーダサイズ × シェーダの数 対策 1. 可能ならば、不要な計算式の除去 (命令数だけで最適化を進めるのは控えた方がよい) #UE4DD

164.

マテリアルインスタンス #UE4DD

165.

Material Instanceは何のデータを持つか Material Material Instance #UE4DD Shader Material Instance Shader Shader … 1. 参照するマテリアルはどれか? 2. 上書きするパラメータの値 Shader

166.

親と違うShaderを使わなければいけないとき、 マテリアルインスタンスは独自のシェーダを保有する。 Material Shader Shader Shader … Shader 親と別のシェーダが必要! Material Instance Material Instance Shader Shader Shader … Shader 名前はマテリアルインスタンスだが、中身はほぼマテリアルと一緒 #UE4DD

167.

マテリアルインスタンスが 別シェーダを必要とするとき 1. 2. 3. Override properties Static Switch Parameter Static Component Mask Parameter #UE4DD

168.

サイズやロードを加味したマテリアルインスタンスの構築 スイッチやプロパティのオーバライドは、 なるべく上位のインスタンスでやり、 その下で単純なパラメータを編集する。 Mat 上の方で スイッチを使う こうすれば その子供達は シェーダを持たない #UE4DD Inst Inst Inst

169.

Tips: マテリアルインスタンスはUsageを持たない。 親のマテリアルのUsageをOnにする。 Material Inst #UE4DD Inst Inst Inst

170.

一つの大きな マスターマテリアルから派生 はおすすめできない Mat Inst Inst Inst • 管理も難しく、 • 一つのシェーダ修正が 沢山のマテリアルインスタンスに影響し • 更にUsageが爆発するのでおすすめできない。 #UE4DD

171.

一つの大きな マスターマテリアルから派生 複数のマスターマテリアルから インスタンスを都度作成。 Mat 程よく分散しましょう Inst Inst Mat Mat Inst Inst #UE4DD Mat Inst Inst Inst Inst Inst

172.

まとめ Management Development マテリアルとマテリアルインスタンスの データ構造から、 マテリアル構築時の注意点をみてきました。 ランタイムやコンパイル時間に影響するので、 開発後半で致命的にならないよう、 開発初期に、検討してみてください。 Runtime #UE4DD

173.

まとめ Management Development Runtime #UE4DD Byking様、 SQEX大阪様の セッションへGO!

174.

End #UE4DD