---
title: マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (Epic Games Japan: 篠山範明) #UE4DD
tags:  #ue4dd #epic games japan  
author: [エピック ゲームズ ジャパン](https://www.docswell.com/user/EpicGamesJapan)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/Z5JGV8R4JL.jpg?width=480
description: 2017年1月21日に行われたライセンシー様向けマテリアル管理勉強会の資料です。(登壇者: Epic Games Japan 篠山範明)   マテリアルとマテリアルインスタンスの内部の仕組み（シェーダ保有の有無）と、それによって生じる落とし穴について説明しております。
published: January 23, 17
canonical: https://www.docswell.com/s/EpicGamesJapan/ZEE28Z-epic-games-japan-ue4dd
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/Z5JGV8R4JL.jpg)

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


# Page. 2

![Page Image](https://bcdn.docswell.com/page/V47Q69VR7P.jpg)

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


# Page. 3

![Page Image](https://bcdn.docswell.com/page/DKE44XMQE1.jpg)

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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/PL714N8L7G.jpg)

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


# Page. 5

![Page Image](https://bcdn.docswell.com/page/8G7WX4ZQJ2.jpg)

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


# Page. 6

![Page Image](https://bcdn.docswell.com/page/W4JZ6213J3.jpg)

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


# Page. 7

![Page Image](https://bcdn.docswell.com/page/KYE62VLZJV.jpg)

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


# Page. 8

![Page Image](https://bcdn.docswell.com/page/5GE52D19E4.jpg)

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


# Page. 9

![Page Image](https://bcdn.docswell.com/page/V9724815ER.jpg)

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


# Page. 10

![Page Image](https://bcdn.docswell.com/page/5DJYM6Z6JM.jpg)

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


# Page. 11

![Page Image](https://bcdn.docswell.com/page/2V7NWZY178.jpg)

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


# Page. 12

![Page Image](https://bcdn.docswell.com/page/GYJ9XZPYE3.jpg)

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


# Page. 13

![Page Image](https://bcdn.docswell.com/page/5GJ821DKJD.jpg)

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


# Page. 14

![Page Image](https://bcdn.docswell.com/page/MLJL2QMPER.jpg)

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


# Page. 15

![Page Image](https://bcdn.docswell.com/page/547M81Y27W.jpg)

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


# Page. 16

![Page Image](https://bcdn.docswell.com/page/ZP7R5L95J9.jpg)

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


# Page. 17

![Page Image](https://bcdn.docswell.com/page/NPJXKWQX7X.jpg)

Material
#UE4DD
Function


# Page. 18

![Page Image](https://bcdn.docswell.com/page/63JK5V997D.jpg)

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


# Page. 19

![Page Image](https://bcdn.docswell.com/page/4LE3KMW9E5.jpg)

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


# Page. 20

![Page Image](https://bcdn.docswell.com/page/V8ED36K87G.jpg)

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


# Page. 21

![Page Image](https://bcdn.docswell.com/page/4V7P4YKWE8.jpg)

Material
#UE4DD
Instance


# Page. 22

![Page Image](https://bcdn.docswell.com/page/L2JVXGV97Q.jpg)

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


# Page. 23

![Page Image](https://bcdn.docswell.com/page/Z5EGV8L4EL.jpg)

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


# Page. 24

![Page Image](https://bcdn.docswell.com/page/V4JQ69YRJP.jpg)

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


# Page. 25

![Page Image](https://bcdn.docswell.com/page/DK744XWQ71.jpg)

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


# Page. 26

![Page Image](https://bcdn.docswell.com/page/PLJ14NYLJG.jpg)

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


# Page. 27

![Page Image](https://bcdn.docswell.com/page/8GJWX4GQE2.jpg)

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


# Page. 28

![Page Image](https://bcdn.docswell.com/page/W4EZ62L3E3.jpg)

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


# Page. 29

![Page Image](https://bcdn.docswell.com/page/KY762VWZEV.jpg)

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


# Page. 30

![Page Image](https://bcdn.docswell.com/page/5G752DM974.jpg)

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


# Page. 31

![Page Image](https://bcdn.docswell.com/page/V9J248957R.jpg)

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


# Page. 32

![Page Image](https://bcdn.docswell.com/page/5DEYM646EM.jpg)

まとめ
#UE4DD


# Page. 33

![Page Image](https://bcdn.docswell.com/page/2VJNWZ61J8.jpg)

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


# Page. 34

![Page Image](https://bcdn.docswell.com/page/GYE9XZLY73.jpg)

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


# Page. 35

![Page Image](https://bcdn.docswell.com/page/5GE821XKED.jpg)

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


# Page. 36

![Page Image](https://bcdn.docswell.com/page/MLEL2Q8P7R.jpg)

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


# Page. 37

![Page Image](https://bcdn.docswell.com/page/54JM8162JW.jpg)

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


# Page. 38

![Page Image](https://bcdn.docswell.com/page/ZPJR5LP5E9.jpg)

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


# Page. 39

![Page Image](https://bcdn.docswell.com/page/NPEXKW3XJX.jpg)

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


# Page. 40

![Page Image](https://bcdn.docswell.com/page/63EK5VY9JD.jpg)

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


# Page. 41

![Page Image](https://bcdn.docswell.com/page/4L73KM9975.jpg)

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


# Page. 42

![Page Image](https://bcdn.docswell.com/page/V87D36G8JG.jpg)

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


# Page. 43

![Page Image](https://bcdn.docswell.com/page/4VJP4Y3W78.jpg)

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


# Page. 44

![Page Image](https://bcdn.docswell.com/page/L2EVXG49JQ.jpg)

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


# Page. 45

![Page Image](https://bcdn.docswell.com/page/Z57GV8147L.jpg)

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


# Page. 46

![Page Image](https://bcdn.docswell.com/page/V4EQ69DREP.jpg)

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


# Page. 47

![Page Image](https://bcdn.docswell.com/page/DKJ44XZQJ1.jpg)

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


# Page. 48

![Page Image](https://bcdn.docswell.com/page/PLE14NRLEG.jpg)

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


# Page. 49

![Page Image](https://bcdn.docswell.com/page/8GEWX41Q72.jpg)

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


# Page. 50

![Page Image](https://bcdn.docswell.com/page/W47Z62P373.jpg)

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


# Page. 51

![Page Image](https://bcdn.docswell.com/page/KYJ62VMZ7V.jpg)

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


# Page. 52

![Page Image](https://bcdn.docswell.com/page/5GJ52DZ9J4.jpg)

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


# Page. 53

![Page Image](https://bcdn.docswell.com/page/4LE3KM92E5.jpg)

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


# Page. 54

![Page Image](https://bcdn.docswell.com/page/V8ED36G67G.jpg)

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


# Page. 55

![Page Image](https://bcdn.docswell.com/page/4V7P4Y8ZE8.jpg)

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


# Page. 56

![Page Image](https://bcdn.docswell.com/page/L2JVXGNM7Q.jpg)

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


# Page. 57

![Page Image](https://bcdn.docswell.com/page/Z5EGV8KXEL.jpg)

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


# Page. 58

![Page Image](https://bcdn.docswell.com/page/V4JQ69N5JP.jpg)

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


# Page. 59

![Page Image](https://bcdn.docswell.com/page/DK744XGV71.jpg)

終わらない Shader Compile
#UE4DD


# Page. 60

![Page Image](https://bcdn.docswell.com/page/PLJ14ND4JG.jpg)

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


# Page. 61

![Page Image](https://bcdn.docswell.com/page/8GJWX4YZE2.jpg)

朗報
#UE4DD


# Page. 62

![Page Image](https://bcdn.docswell.com/page/W4EZ62XLE3.jpg)

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


# Page. 63

![Page Image](https://bcdn.docswell.com/page/KY762V4MEV.jpg)

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


# Page. 64

![Page Image](https://bcdn.docswell.com/page/5G752DQQ74.jpg)

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


# Page. 65

![Page Image](https://bcdn.docswell.com/page/V9J248PW7R.jpg)

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


# Page. 66

![Page Image](https://bcdn.docswell.com/page/5DEYM659EM.jpg)

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


# Page. 67

![Page Image](https://bcdn.docswell.com/page/2VJNWZNDJ8.jpg)

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


# Page. 68

![Page Image](https://bcdn.docswell.com/page/GYE9XZR873.jpg)

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


# Page. 69

![Page Image](https://bcdn.docswell.com/page/5GE821WZED.jpg)

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


# Page. 70

![Page Image](https://bcdn.docswell.com/page/MLEL2QN17R.jpg)

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


# Page. 71

![Page Image](https://bcdn.docswell.com/page/54JM81X5JW.jpg)

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


# Page. 72

![Page Image](https://bcdn.docswell.com/page/ZPJR5LNZE9.jpg)

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


# Page. 73

![Page Image](https://bcdn.docswell.com/page/NPEXKWN1JX.jpg)

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


# Page. 74

![Page Image](https://bcdn.docswell.com/page/63EK5VNMJD.jpg)

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


# Page. 75

![Page Image](https://bcdn.docswell.com/page/4L73KMV275.jpg)

Material の Usage項目
#UE4DD


# Page. 76

![Page Image](https://bcdn.docswell.com/page/V87D3686JG.jpg)

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


# Page. 77

![Page Image](https://bcdn.docswell.com/page/4VJP4YWZ78.jpg)

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


# Page. 78

![Page Image](https://bcdn.docswell.com/page/L2EVXG8MJQ.jpg)

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


# Page. 79

![Page Image](https://bcdn.docswell.com/page/Z57GV85X7L.jpg)

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


# Page. 80

![Page Image](https://bcdn.docswell.com/page/V4EQ69Z5EP.jpg)

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


# Page. 81

![Page Image](https://bcdn.docswell.com/page/DKJ44X3VJ1.jpg)

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


# Page. 82

![Page Image](https://bcdn.docswell.com/page/PLE14N14EG.jpg)

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


# Page. 83

![Page Image](https://bcdn.docswell.com/page/8GEWX48Z72.jpg)

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


# Page. 84

![Page Image](https://bcdn.docswell.com/page/W47Z628L73.jpg)

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


# Page. 85

![Page Image](https://bcdn.docswell.com/page/KYJ62VPM7V.jpg)

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


# Page. 86

![Page Image](https://bcdn.docswell.com/page/5GJ52DKQJ4.jpg)

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


# Page. 87

![Page Image](https://bcdn.docswell.com/page/V9E248WWJR.jpg)

Shader Permutation Reduction
Support Stationary Skylight
#UE4DD


# Page. 88

![Page Image](https://bcdn.docswell.com/page/5D7YM6L97M.jpg)

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


# Page. 89

![Page Image](https://bcdn.docswell.com/page/2VENWZ4DE8.jpg)

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


# Page. 90

![Page Image](https://bcdn.docswell.com/page/GY79XZQ8J3.jpg)

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


# Page. 91

![Page Image](https://bcdn.docswell.com/page/5G7821GZ7D.jpg)

Shader Permutation Reduction
Support Atmospheric Fog
#UE4DD


# Page. 92

![Page Image](https://bcdn.docswell.com/page/ML7L2QG1JR.jpg)

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


# Page. 93

![Page Image](https://bcdn.docswell.com/page/54EM81Q5EW.jpg)

Shader Permutation Reduction
Support Pointlight WholeSceneShadows
#UE4DD


# Page. 94

![Page Image](https://bcdn.docswell.com/page/ZPER5L8Z79.jpg)

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


# Page. 95

![Page Image](https://bcdn.docswell.com/page/NP7XKW81EX.jpg)

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


# Page. 96

![Page Image](https://bcdn.docswell.com/page/637K5VKMED.jpg)

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


# Page. 97

![Page Image](https://bcdn.docswell.com/page/4LJ3KMZ2J5.jpg)

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


# Page. 98

![Page Image](https://bcdn.docswell.com/page/V8JD36R6EG.jpg)

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


# Page. 99

![Page Image](https://bcdn.docswell.com/page/4VEP4YMZJ8.jpg)

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


# Page. 100

![Page Image](https://bcdn.docswell.com/page/L27VXG9MEQ.jpg)

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


# Page. 101

![Page Image](https://bcdn.docswell.com/page/Z5JGV8ZXJL.jpg)

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


# Page. 102

![Page Image](https://bcdn.docswell.com/page/V47Q69L57P.jpg)

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


# Page. 103

![Page Image](https://bcdn.docswell.com/page/DKE44XDVE1.jpg)

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


# Page. 104

![Page Image](https://bcdn.docswell.com/page/PL714NZ47G.jpg)

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


# Page. 105

![Page Image](https://bcdn.docswell.com/page/8G7WX49ZJ2.jpg)

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


# Page. 106

![Page Image](https://bcdn.docswell.com/page/W4JZ629LJ3.jpg)

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


# Page. 107

![Page Image](https://bcdn.docswell.com/page/KYE62VKMJV.jpg)

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


# Page. 108

![Page Image](https://bcdn.docswell.com/page/5GE52DPQE4.jpg)

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


# Page. 109

![Page Image](https://bcdn.docswell.com/page/V972486WER.jpg)

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


# Page. 110

![Page Image](https://bcdn.docswell.com/page/5DJYM699JM.jpg)

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


# Page. 111

![Page Image](https://bcdn.docswell.com/page/2V7NWZLD78.jpg)

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


# Page. 112

![Page Image](https://bcdn.docswell.com/page/GYJ9XZ48E3.jpg)

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


# Page. 113

![Page Image](https://bcdn.docswell.com/page/5GJ821QZJD.jpg)

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


# Page. 114

![Page Image](https://bcdn.docswell.com/page/MLJL2QX1ER.jpg)

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


# Page. 115

![Page Image](https://bcdn.docswell.com/page/547M81L57W.jpg)

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


# Page. 116

![Page Image](https://bcdn.docswell.com/page/ZP7R5LKZJ9.jpg)

マテリアルのまとめ
#UE4DD


# Page. 117

![Page Image](https://bcdn.docswell.com/page/NPJXKWL17X.jpg)

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


# Page. 118

![Page Image](https://bcdn.docswell.com/page/63JK5VLM7D.jpg)

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


# Page. 119

![Page Image](https://bcdn.docswell.com/page/4LE3KM32E5.jpg)

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


# Page. 120

![Page Image](https://bcdn.docswell.com/page/V8ED36467G.jpg)

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


# Page. 121

![Page Image](https://bcdn.docswell.com/page/4V7P4YVZE8.jpg)

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


# Page. 122

![Page Image](https://bcdn.docswell.com/page/L2JVXGZM7Q.jpg)

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


# Page. 123

![Page Image](https://bcdn.docswell.com/page/Z5EGV84XEL.jpg)

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


# Page. 124

![Page Image](https://bcdn.docswell.com/page/V4JQ69G5JP.jpg)

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


# Page. 125

![Page Image](https://bcdn.docswell.com/page/DK744X5V71.jpg)

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


# Page. 126

![Page Image](https://bcdn.docswell.com/page/PLJ14NW4JG.jpg)

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


# Page. 127

![Page Image](https://bcdn.docswell.com/page/8GJWX46ZE2.jpg)

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


# Page. 128

![Page Image](https://bcdn.docswell.com/page/W4EZ62YLE3.jpg)

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


# Page. 129

![Page Image](https://bcdn.docswell.com/page/KY762VDMEV.jpg)

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


# Page. 130

![Page Image](https://bcdn.docswell.com/page/5G752D3Q74.jpg)

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


# Page. 131

![Page Image](https://bcdn.docswell.com/page/V9J248ZW7R.jpg)

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


# Page. 132

![Page Image](https://bcdn.docswell.com/page/5DEYM6R9EM.jpg)

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


# Page. 133

![Page Image](https://bcdn.docswell.com/page/2VJNWZDDJ8.jpg)

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


# Page. 134

![Page Image](https://bcdn.docswell.com/page/GYE9XZG873.jpg)

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


# Page. 135

![Page Image](https://bcdn.docswell.com/page/5GE821VZED.jpg)

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


# Page. 136

![Page Image](https://bcdn.docswell.com/page/MLEL2Q517R.jpg)

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


# Page. 137

![Page Image](https://bcdn.docswell.com/page/54JM8135JW.jpg)

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


# Page. 138

![Page Image](https://bcdn.docswell.com/page/ZPJR5LQZE9.jpg)

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


# Page. 139

![Page Image](https://bcdn.docswell.com/page/NPEXKW51JX.jpg)

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


# Page. 140

![Page Image](https://bcdn.docswell.com/page/63EK5V6MJD.jpg)

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


# Page. 141

![Page Image](https://bcdn.docswell.com/page/4L73KM6275.jpg)

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


# Page. 142

![Page Image](https://bcdn.docswell.com/page/V87D36V6JG.jpg)

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


# Page. 143

![Page Image](https://bcdn.docswell.com/page/4VJP4YRZ78.jpg)

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


# Page. 144

![Page Image](https://bcdn.docswell.com/page/L2EVXGRMJQ.jpg)

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


# Page. 145

![Page Image](https://bcdn.docswell.com/page/Z57GV8MX7L.jpg)

Material の Usage項目
#UE4DD
再掲載


# Page. 146

![Page Image](https://bcdn.docswell.com/page/V4EQ69R5EP.jpg)

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


# Page. 147

![Page Image](https://bcdn.docswell.com/page/DKJ44X8VJ1.jpg)

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


# Page. 148

![Page Image](https://bcdn.docswell.com/page/PLE14N24EG.jpg)

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


# Page. 149

![Page Image](https://bcdn.docswell.com/page/8GEWX4RZ72.jpg)

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


# Page. 150

![Page Image](https://bcdn.docswell.com/page/W47Z62RL73.jpg)

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


# Page. 151

![Page Image](https://bcdn.docswell.com/page/KYJ62VRM7V.jpg)

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


# Page. 152

![Page Image](https://bcdn.docswell.com/page/5GJ52D8QJ4.jpg)

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


# Page. 153

![Page Image](https://bcdn.docswell.com/page/4LE3KM8ZE5.jpg)

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


# Page. 154

![Page Image](https://bcdn.docswell.com/page/V8ED36M47G.jpg)

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


# Page. 155

![Page Image](https://bcdn.docswell.com/page/4V7P4YRVE8.jpg)

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


# Page. 156

![Page Image](https://bcdn.docswell.com/page/L2JVXGRR7Q.jpg)

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


# Page. 157

![Page Image](https://bcdn.docswell.com/page/Z5EGV8M6EL.jpg)

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


# Page. 158

![Page Image](https://bcdn.docswell.com/page/V4JQ69R2JP.jpg)

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


# Page. 159

![Page Image](https://bcdn.docswell.com/page/DK744X8P71.jpg)

マテリアル
#UE4DD


# Page. 160

![Page Image](https://bcdn.docswell.com/page/PLJ14N2XJG.jpg)

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


# Page. 161

![Page Image](https://bcdn.docswell.com/page/8GJWX4RKE2.jpg)

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


# Page. 162

![Page Image](https://bcdn.docswell.com/page/W4EZ62RNE3.jpg)

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


# Page. 163

![Page Image](https://bcdn.docswell.com/page/KY762VR9EV.jpg)

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


# Page. 164

![Page Image](https://bcdn.docswell.com/page/5G752D8D74.jpg)

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


# Page. 165

![Page Image](https://bcdn.docswell.com/page/V9J248VM7R.jpg)

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


# Page. 166

![Page Image](https://bcdn.docswell.com/page/5DEYM63PEM.jpg)

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


# Page. 167

![Page Image](https://bcdn.docswell.com/page/2VJNWZVMJ8.jpg)

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


# Page. 168

![Page Image](https://bcdn.docswell.com/page/GYE9XZ6W73.jpg)

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


# Page. 169

![Page Image](https://bcdn.docswell.com/page/5GE821ZRED.jpg)

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


# Page. 170

![Page Image](https://bcdn.docswell.com/page/MLEL2QD27R.jpg)

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


# Page. 171

![Page Image](https://bcdn.docswell.com/page/54JM81P9JW.jpg)

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


# Page. 172

![Page Image](https://bcdn.docswell.com/page/ZPJR5L19E9.jpg)

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


# Page. 173

![Page Image](https://bcdn.docswell.com/page/NPEXKWY3JX.jpg)

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


# Page. 174

![Page Image](https://bcdn.docswell.com/page/63EK5V3NJD.jpg)

End
#UE4DD


