マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (epic games...

Post on 13-Apr-2017

10.747 Views

Category:

Engineering

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

#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

top related