UE4勉強会 in 大阪
マテリアルの注意すべきこと!
Slideshare用壁紙
Slideshare用壁紙
自己紹介
● Twitter: @com04
● ゲームプログラマー
● 作ったものとかは大体twitterモーメントに
○ https://twitter.com/i/moments/847072031048814594
○ https://twitter.com/i/moments/986364547098275840
● マーケットプレイスに出品しました
○ ComMaterialTools - マテリアル検索の便利ツール
■ https://www.unrealengine.com/marketplace/commaterialtools
自己紹介
● 講演したスライド
− マテリアル基礎・初級: https://www.slideshare.net/com044/ue4-80326829
− UE4でのチーム製作: https://www.slideshare.net/com044/4ue4-in-ue4
− アニメーション基礎: https://www.slideshare.net/com044/ue4-in-91056422
− もっとアニメーションBP: https://www.slideshare.net/com044/ue4-in-bp
− UE4 LODs for Optimization -Beginner-:
https://www.slideshare.net/com044/lods-for-optimization-beginner
− Volumetric Fogで空間を演出する!:
https://www.slideshare.net/com044/ue4-volumetric-fog
− UE4でTranslucencyやUnlitに影を落としたい!:
https://www.slideshare.net/com044/ue4translucencyunlit
− AI基礎 : https://www.slideshare.net/com044/ai-128474721
− UE4でAIとビヘイビアツリーと-基礎- : https://www.slideshare.net/com044/ue4ai
5
もくじ
● はじめに
● マテリアルでロードされるテクスチャ
○ パターン1~8
● Switch / Override
○ パターン1~4
● 痒いところのTips
○ Texture枚数
○ Vertex Interpolator
version: UE4.21.3
もくじ
● はじめに
● マテリアルでロードされるテクスチャ
○ パターン1~8
● Switch / Override
○ パターン1~4
● 痒いところのTips
○ Texture枚数
○ Vertex Interpolator
はじめに
今日話さない事
● マテリアルの組み方
● マテリアルの最適化
はじめに
今日話す事
● 地味な検証の話
はじめに
※注意して検証を行いましたが、もし環境によっての違い
や、間違い等ありましたらごめんなさい
もくじ
● はじめに
● マテリアルでロードされるテクスチャ
○ パターン1~8
● Switch / Override
○ パターン1~4
● 痒いところのTips
○ Texture枚数
○ Vertex Interpolator
マテリアルでロードされるテクスチャ
マテリアルで使用されるテクスチャ。
どんな条件でロードされるのかを調べてみました
マテリアルでロードされるテクスチャ
確認方法
マテリアルでロードされるテクスチャ - 確認方法
Shippingパッケージして確認します。
エディター上では正確に取れない事があります。
マテリアルでロードされるテクスチャ - 確認方法
1. BP内の変数でObject型の「Soft Object Reference」を
作成します。
マテリアルでロードされるテクスチャ - 確認方法
2. 調べたいアセットを変数に設定します
マテリアルでロードされるテクスチャ - 確認方法
3. アセットの変数を「Resolve Soft Reference」して確認し
ます。存在していればロード済みです。
マテリアルでロードされるテクスチャ - 確認方法
4. 後は調べたいマテリアルを貼ったメッシュをサブレベル
に配置して、「Load Stream Level」で読み込んで調べます
もくじ
● はじめに
● マテリアルでロードされるテクスチャ
○ パターン1~8
● Switch / Override
○ パターン1~4
● 痒いところのTips
○ Texture枚数
○ Vertex Interpolator
マテリアルでロードされるテクスチャ
パターン1
Texture
マテリアルでロードされるテクスチャ - パターン1
TextureSampleParameter2Dで「緑」テクスチャを貼ったマ
テリアル
マテリアルでロードされるテクスチャ - パターン1
結果
ロードされます。問題なし。
マテリアルでロードされるテクスチャ
パターン2
マテリアルインスタンスで上書き
マテリアルでロードされるテクスチャ - パターン2
TextureSampleParameter2Dで「緑」を貼ったマテリアル
マテリアルでロードされるテクスチャ - パターン2
そこから子マテリアルインスタンスを作成してテクスチャを
「赤」で上書き。
マテリアルでロードされるテクスチャ - パターン2
この「赤」のマテリアルインスタンスのみを貼り付けて使用
します。
親 子
マテリアルでロードされるテクスチャ - パターン2
結果
実際には使用していない親マテリアルの「緑」テクスチャも
ロードされています。
マテリアルでロードされるテクスチャ - パターン2
使用するマテリアルインスタンスで使っていなくても、親マ
テリアルが使用しているだけでロードされてしまいます。
マテリアルでロードされるテクスチャ - パターン2
親マテリアルで使用するテクスチャは、ロードされても問題
のない
1x1のような小さいテクスチャを貼り付けておきましょう。
マテリアルでロードされるテクスチャ
パターン3
中間のマテリアルインスタンス
マテリアルでロードされるテクスチャ - パターン3
TextureSampleParameter2Dで「緑」を貼ったマテリアル
マテリアルでロードされるテクスチャ - パターン3
そこから子マテリアルインスタンスを作成してテクスチャを
「赤」で上書き。
更に子マテリアルインスタンスを作成して「緑」で上書き
マテリアルでロードされるテクスチャ - パターン3
緑→赤→緑
で子マテリアルインスタンスを作成。
この一番下の「緑」マテリアルインスタンスを使用する
親 子 子子
マテリアルでロードされるテクスチャ - パターン3
結果
実際には使用していない中間マテリアルの「赤」テクスチャ
もロードされています。
マテリアルでロードされるテクスチャ - パターン3
マテリアルの親子階層全てのテクスチャがロードされます。
マテリアルインスタンスの親子付けを構築する際は、親マ
テリアルのテクスチャ設定に気をつけましょう
マテリアルでロードされるテクスチャ
パターン4
TextureSampleに残っていた設定
マテリアルでロードされるテクスチャ - パターン4
「赤」を設定されたTextureObjectから、TextureSampleす
るだけのノード構成。
マテリアルでロードされるテクスチャ - パターン4
しかしよく見ると、TextureSampleノードのデフォルト値に
「緑」が付きっぱなし!
(でも一切使用されない)
マテリアルでロードされるテクスチャ - パターン4
結果
「緑」テクスチャもロードされます。一切使用されないですが
……
マテリアルでロードされるテクスチャ - パターン4
どうやったらこのノード出来るの?
マテリアルでロードされるテクスチャ - パターン4
1. TextureSampleノードを作って「緑」テクスチャを設定し
ます
マテリアルでロードされるテクスチャ - パターン4
2. やっぱり複数箇所で同じテクスチャ使いたい!となりまし
た。
Texピンから引っ張って「TextureObject」ノードを作ります
マテリアルでロードされるテクスチャ - パターン4
3. 調整していくと「赤」を使う事に決まったので
TextureObjectを「赤」にします
マテリアルでロードされるテクスチャ - パターン4
4. この手順で一番初めに設定したTextureSampleノードに
古いテクスチャが残ったままになります
マテリアルでロードされるテクスチャ - パターン4
もうひとつのパターン。
TextureObjectノードからTextureSampleノードを出しま
す。
マテリアルでロードされるテクスチャ - パターン4
この時、コンテンツブラウザでテクスチャが選択されている
と、そのアセットが設定されます!
マテリアルでロードされるテクスチャ - パターン4
修正方法
マテリアルでロードされるテクスチャ - パターン4
そのままでは編集出来ないようになっているので……
マテリアルでロードされるテクスチャ - パターン4
Texピンの接続を一旦切ると編集出来るようになります。
その後、TextureSampleノードのTexture欄をクリアします。
マテリアルでロードされるテクスチャ - パターン4
クリア出来たら再度Texピンを繋いで完了!
マテリアルでロードされるテクスチャ - パターン4
TexピンからTextureObjectを出したい時は、一旦テクス
チャ設定をクリアする癖を付けましょう。
後はReference Viewerで確認しましょう(後述)
マテリアルでロードされるテクスチャ
パターン5
マテリアル関数のPreview
マテリアルでロードされるテクスチャ - パターン5
マテリアル関数の引数Texture2DのPreview用に「緑」テク
スチャを設定します。
(このマテリアル関数内でのみプレビューする用)
マテリアルでロードされるテクスチャ - パターン5
そのマテリアル関数を使う所で、引数にTextureObjectで
「赤」を渡します。
マテリアルでロードされるテクスチャ - パターン5
結果
Previewにしか繋いでない筈の「緑」テクスチャがロードさ
れます。
マテリアルでロードされるテクスチャ - パターン5
対処方法
マテリアルでロードされるテクスチャ - パターン5
● Preview用は消しておいて、Developフォルダにマテリ
アル関数確認用のマテリアル作るか……
● Preview用の軽い共通テクスチャを用意するとか
……?
(でもエンジンコンテンツのマテリアル関数にもこのパターン一杯ある……)
マテリアルでロードされるテクスチャ
パターン6
どこにも繋がってないノード
マテリアルでロードされるテクスチャ - パターン6
そもそもどこにも繋がってなくて使ってない。
けどノードだけ残ってる
マテリアルでロードされるテクスチャ - パターン6
結果
どこにも繋がってない「緑」テクスチャがロードされた。
マテリアルでロードされるテクスチャ
パターン7
BPで上書き
マテリアルでロードされるテクスチャ - パターン7
「緑」テクスチャをくっつけたマテリアルを用意。
メッシュエディターでそのマテリアルを設定。
マテリアルでロードされるテクスチャ - パターン7
新規のBPを作って先程のメッシュを設定します
マテリアルでロードされるテクスチャ - パターン7
今度は「赤」テクスチャだけのマテリアルを用意。
BPのメッシュ欄マテリアルに設定。デフォルトのマテリアル
を上書きします。
マテリアルでロードされるテクスチャ - パターン7
こんな感じ
メッシュデフォルトのマテ
リアルを上書き
マテリアルでロードされるテクスチャ - パターン7
結果
BPで「赤」に上書きしたけど、デフォルトマテリアルの「緑」
テクスチャも読み込まれます
マテリアルでロードされるテクスチャ - パターン7
同じメッシュから、マテリアルでカラーバリエーションを作る
際はご注意を……
マテリアルでロードされるテクスチャ
パターン8
レベル上で上書き
マテリアルでロードされるテクスチャ - パターン8
先ほどと同じようにBPに「緑」テクス
チャのメッシュを登録。
今度はBP上ではなく、レベル上で
「赤」テクスチャのマテリアルに差し
替え。
マテリアルでロードされるテクスチャ - パターン8
結果
同じように「緑」テクスチャも読み込まれます
マテリアルでロードされるテクスチャ
まとめ
マテリアルでロードされるテクスチャ - まとめ
割と簡単に使ってないテクスチャが読み込まれます。
細かく注意していきましょう。
マテリアルでロードされるテクスチャ
エディター上での確認
マテリアルでロードされるテクスチャ - エディター上での確認
コンテンツブラウザでアセットを右クリック。
「Reference Viewer」で何が読み込まれるか確認できま
す。
右側のアセットが同時に
読み込まれる
マテリアルでロードされるテクスチャ
読み込んだテクスチャリストを表示
マテリアルでロードされるテクスチャ - 読み込んだリストを表示
スタンドアローン起動、もしくはDevelopパッケージ版で起動
します。
起動して確認したいタイミングで、「@」キーを押したら出てく
るコンソールから「Obj List Class=Texture2D」
マテリアルでロードされるテクスチャ - 読み込んだリストを表示
コマンドを打ち込むとログに出力されます。
「@」キーを2回押すと枠が拡張されてログが確認出来ま
す。
(もしくはプロジェクトフォルダのSaved/Logs/内)
もくじ
● はじめに
● マテリアルでロードされるテクスチャ
○ パターン1~8
● Switch / Override
○ パターン1~4
● 痒いところのTips
○ Texture枚数
○ Vertex Interpolator
Switch / Override
Static Switch Parameter もしくは Static Bool Parameter
ノード。
子マテリアルインスタンス側でフラグを操作して処理を変更
することが出来ます。
Switch / Override
もしくは、子マテリアルインスタンス側で変更出来るBlend
ModeやShading Model, Two Sidedなど。
Switch / Override
について。
Switch / Override
UE4マテリアル触る人のバイブル。
● 大規模タイトルにおけるエフェクトマテリアル運用 (SQEX
大阪: 林武尊様)
○ https://www.slideshare.net/EpicGamesJapan/sqex-ue4dd
Switch / Override
「分岐を変えると別シェーダーになり」
引用:
https://www.slideshare.net/EpicGame
sJapan/sqex-ue4dd
Switch / Override
UE4マテリアル触る人のバイブル。
● マテリアルとマテリアルインスタンスの仕組みと問題点
の共有 (Epic Games Japan: 篠山範明)
○ https://www.slideshare.net/EpicGamesJapan/epic-games-japan-ue4dd
Switch / Override
「データサイズやロード時間」「同一組み合わせのシェーダ
は一つのインスタンスのみ」
引用: https://www.slideshare.net/EpicGamesJapan/epic-games-japan-ue4dd
Switch / Override
影響するのは
ディスクサイズ?(+ロード時間)
シェーダーメモリ?
レンダリング時は同じシェーダー?
マテリアルインスタンスが兄弟の時は?
Switch / Override
2つのスライド。UE4バージョン4.13~4.14
→2016年11月
Today 2019年3月
現在の4.21だと?
→結論を先に出しますが、バージョンで挙動に違いはあり
ませんでした。
Switch / Override
気になったので調べました
Switch / Override
確認方法
Switch / Override - 確認方法
マテリアル
● Static Switch Parameter を用意。テクスチャ使うかどう
か。デフォルトOFF。
● デフォルトOpaque
● この子マテリアル
インスタンスのみで
調べます
○ (マスターマテリアルは
共通です)
Switch / Override - 確認方法
メモリ系はstat系のコマンドを使用します。
「stat shaders」と「stat memory」
Switch / Override - 確認方法
● Num Shader Resources Loaded
○ 読み込んだシェーダーのリソース数
● PixelShader Memory
○ ピクセルシェーダーのメモリ量
Switch / Override - 確認方法
ディスクサイズはパッケージングした結果で確認します。
もくじ
● はじめに
● マテリアルでロードされるテクスチャ
○ パターン1~8
● Switch / Override
○ パターン1~4
● 痒いところのTips
○ Texture枚数
○ Vertex Interpolator
Switch / Override
パターン1
Switch ON→OFF→ON
Switch / Override - パターン1
子マテリアルインスタンスでON。
更にその子マテリアルインスタンスでOFF
親
子
子子
①
②
③
数字の順にロードし
ていきます
Switch / Override - パターン1
結果
Shader Resources
Loaded
Pixel Shader
Memory
ディスクサ
イズ
レンダリング時の
シェーダー
①Switch OFF(親) 2,192 2.61 MB 4 KB A
②Switch ON (子) 2,274 2.79 MB 1,220 KB B
③Switch OFF (子子) 2,274 2.79 MB 1,220 KB A
同じ文字IDだと
同じシェーダーが走ってる
Switch / Override
パターン2
プロパティオーバーライド Opaque→Masked→Opaque
Switch / Override - パターン2
子マテリアルインスタンスでMasked。
更にその子マテリアルインスタンスでOpaque。
親
子
子子
①
②
③
Switch / Override - パターン2
結果
Shader Resources
Loaded
Pixel Shader
Memory
ディスクサ
イズ
レンダリング時の
シェーダー
①Opaque(親) 2,192 2.61 MB 4 KB A
②Masked(子) 2,378 2.83 MB 2,355 KB B
③Opaque(子子) 2,378 2.83 MB 1,220 KB A
Switch / Override - パターン2
ここまでのまとめ
● 途中でSwitch等の切り替えがあっても、最終的に同じ
シェーダーの組み合わせなら、
○ シェーダーのメモリを喰わない
○ レンダリング時のシェーダーは同じものが使用される
● ただ、Switch結果が同じシェーダーになったとしても、
Switchの操作が存在するとディスクサイズは増える
Switch / Override
パターン3
末端でSwitch操作
Switch / Override - パターン3
「マテリアルとマテリアルインスタンスの仕組みと問題点の
共有」スライドの左側の例
引用: https://www.slideshare.net/EpicGamesJapan/epic-games-japan-ue4dd
Switch / Override - パターン3
ツリー
①
② ③
④ ⑤ ⑥ ⑦
末端でSwitchや
プロパティ操作
Switch / Override - パターン3
結果
Shader Resources
Loaded
Pixel Shader
Memory
ディスク
サイズ
レンダリング時の
シェーダー
①OFF / Opaque(親) 2,192 2.61 MB 4 KB A
②OFF / Opaque(左側-子) 2,192 2.61 MB 4 KB A
③OFF / Opaque(右側-子) 2,192 2.61 MB 4 KB A
④ON / Opaque(左側-子子) 2,274 2.79 MB 1,220 KB C
⑤ON / Masked(左側-子子) 2,435 3.05 MB 2,396 KB B
⑥ON / Opaque(右側-子子) 2,435 3.05 MB 1,220 KB C
⑦ON / Masked(右側-子子) 2,435 3.05 MB 2,396 KB B
Switch / Override
パターン4
中間でSwitch操作
Switch / Override - パターン4
「マテリアルとマテリアルインスタンスの仕組みと問題点の
共有」スライドの右側の例
引用: https://www.slideshare.net/EpicGamesJapan/epic-games-japan-ue4dd
Switch / Override - パターン4
ツリー
①
② ③
④ ⑤ ⑥ ⑦
中間でSwitchや
プロパティ操作
Switch / Override - パターン4
結果
Shader Resources
Loaded
Pixel Shader
Memory
ディスク
サイズ
レンダリング時の
シェーダー
①OFF / Opaque(親) 2,192 2.61 MB 4 KB A
②ON / Opaque(左側-子) 2,274 2.79 MB 1,220 KB C
③ON / Masked(右側-子) 2,435 3.05 MB 2,396 KB B
④ON / Opaque(左側-子子) 2,435 3.05 MB 4 KB C
⑤ON / Opaque(左側-子子) 2,435 3.05 MB 4 KB C
⑥ON / Masked(右側-子子) 2,435 3.05 MB 4 KB B
⑦ON / Masked(右側-子子) 2,435 3.05 MB 4 KB B
Switch / Override
まとめ
Switch / Override - まとめ
末端でSwitch/プロパティ操作と、
中間でSwitch/プロパティ操作
Switch / Override - まとめ
最終的な末端のマテリアルインスタンスを使用していると、
どちらのパターンでもランタイムのメモリや描画時のシェー
ダーに差は無い。
マスターマテリアルさえ同じなら、兄弟インスタンスでも同じ
シェーダーを引っ張ってくれる。
Switch / Override - まとめ
影響が出てくるのはディスクサイズ。
パッケージのサイズや、ロード時間に影響する。
● 末端でSwitch: 7,244 KB
● 中間でSwitch: 3,636 KB
Switch / Override - まとめ
今回は末端が4つでしたが、これが数百個とかになってくる
と……
初めから管理しておく方が良い事が多いので早めの設計
を。
逆に、どうしても末端でSwitch入れたい場合は最悪ディス
クサイズのみの影響に留まります。担当者と要相談。
もくじ
● はじめに
● マテリアルでロードされるテクスチャ
○ パターン1~8
● Switch / Override
○ パターン1~4
● 痒いところのTips
○ Texture枚数
○ Vertex Interpolator
痒いところのTips - Texture枚数
1マテリアルに使えるテクスチャ枚数は?
Texture枚数
そのまま使うと13枚くらいで打ち止め。
(枚数はShading Modelによって変化)
エラーが出るようになります。
Texture枚数
このエラーは「テクスチャ枚数の限界」ではなく、
TextureSamplerが最大16個までしか使えない。というエ
ラー。
● TextureSampler
○ シェーダー内部でテクスチャをどの設定で読み込み、使用す
るかのパラメーター
Texture枚数
TextureSampleノードのSamplerを「Shared」系にすれば
共通のTextureSamplerが使用され、その枠を消費する事
が無くなります。
Texture枚数
いくらでも使える!
Texture枚数
(とはいえ、特定のハードウェアではテクスチャ枚数に限界
があるので注意してください)
Texture枚数
ただしSharedを使うと、一部のテクスチャ設定が無視さ
れ、固定された設定になります。
● 固定される設定
○ Filter: “World” TextureGroupの設定
○ X-Axis Tiling Method: Wrap or Clamp (どちらか指定)
○ Y-Axis Tiling Method: Wrap or Clamp (どちらか指定)
○ LOD Bias: “r.MipMapLODBias”の値
Texture枚数
Texture Samplerを使用している数は、「ウィンドウ」→
「Stats」から表示される欄に表示されます。
この例では「4/16」
4つ使用中。
もくじ
● はじめに
● マテリアルでロードされるテクスチャ
○ パターン1~8
● Switch / Override
○ パターン1~4
● 痒いところのTips
○ Texture枚数
○ Vertex Interpolator
Vertex Interpolator
頂点シェーダーからピクセルシェーダーへパラメーターを渡
せるノード。
Vertex Interpolator
主な用途としては、頂点シェーダーでしか使えないパラメー
ターを渡したりします。
Pre-Skinned系が良く使用されるかと思います。
Vertex Interpolator
ただし、渡せる制限があります。
TexCoordと合わせて、Vector4個(=Scalar16個)まで。
Statsで確認できます。
Vertex Interpolator
TexCoordノードはCoordinate Index1種類に付きScalar2
個分使用します。
Coordinate Index 0と1の
2種使っているので、
2種 × Scalar2 = Scalar4
Vertex Interpolator
Vertex Interpolatorノードで使用するScalarの数は、
引数の要素数によって変わります
RGの2種でScalar 2
RGBの3種でScalar 3
Vertex Interpolator
Vertex Interpolateノードの注意点!
Vertex Interpolator
下記のノード、同じ構成をしているのでコンパイル時に共通
化されてScalar3個になるかと思いきや……
Vertex Interpolator
別々の物と認識されてScalar 9個使用されます!
Vertex Interpolator
回避する方法
Vertex Interpolator
マテリアル関数に閉じ込めます。
Vertex Interpolator
このマテリアル関数ならいくら使っても増えません!
(これだと同一のノードと認識される模様)
以上!

[UE4]マテリアルの注意すべきこと!~テクスチャロードとSwitch~