Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

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

2.485 Aufrufe

Veröffentlicht am

https://ue4study-osaka.connpass.com/event/120568/

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

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

  1. 1. UE4勉強会 in 大阪 マテリアルの注意すべきこと!
  2. 2. Slideshare用壁紙
  3. 3. Slideshare用壁紙
  4. 4. 自己紹介 ● Twitter: @com04 ● ゲームプログラマー ● 作ったものとかは大体twitterモーメントに ○ https://twitter.com/i/moments/847072031048814594 ○ https://twitter.com/i/moments/986364547098275840 ● マーケットプレイスに出品しました ○ ComMaterialTools - マテリアル検索の便利ツール ■ https://www.unrealengine.com/marketplace/commaterialtools
  5. 5. 自己紹介 ● 講演したスライド − マテリアル基礎・初級: 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
  6. 6. もくじ ● はじめに ● マテリアルでロードされるテクスチャ ○ パターン1~8 ● Switch / Override ○ パターン1~4 ● 痒いところのTips ○ Texture枚数 ○ Vertex Interpolator version: UE4.21.3
  7. 7. もくじ ● はじめに ● マテリアルでロードされるテクスチャ ○ パターン1~8 ● Switch / Override ○ パターン1~4 ● 痒いところのTips ○ Texture枚数 ○ Vertex Interpolator
  8. 8. はじめに 今日話さない事 ● マテリアルの組み方 ● マテリアルの最適化
  9. 9. はじめに 今日話す事 ● 地味な検証の話
  10. 10. はじめに ※注意して検証を行いましたが、もし環境によっての違い や、間違い等ありましたらごめんなさい
  11. 11. もくじ ● はじめに ● マテリアルでロードされるテクスチャ ○ パターン1~8 ● Switch / Override ○ パターン1~4 ● 痒いところのTips ○ Texture枚数 ○ Vertex Interpolator
  12. 12. マテリアルでロードされるテクスチャ マテリアルで使用されるテクスチャ。 どんな条件でロードされるのかを調べてみました
  13. 13. マテリアルでロードされるテクスチャ 確認方法
  14. 14. マテリアルでロードされるテクスチャ - 確認方法 Shippingパッケージして確認します。 エディター上では正確に取れない事があります。
  15. 15. マテリアルでロードされるテクスチャ - 確認方法 1. BP内の変数でObject型の「Soft Object Reference」を 作成します。
  16. 16. マテリアルでロードされるテクスチャ - 確認方法 2. 調べたいアセットを変数に設定します
  17. 17. マテリアルでロードされるテクスチャ - 確認方法 3. アセットの変数を「Resolve Soft Reference」して確認し ます。存在していればロード済みです。
  18. 18. マテリアルでロードされるテクスチャ - 確認方法 4. 後は調べたいマテリアルを貼ったメッシュをサブレベル に配置して、「Load Stream Level」で読み込んで調べます
  19. 19. もくじ ● はじめに ● マテリアルでロードされるテクスチャ ○ パターン1~8 ● Switch / Override ○ パターン1~4 ● 痒いところのTips ○ Texture枚数 ○ Vertex Interpolator
  20. 20. マテリアルでロードされるテクスチャ パターン1 Texture
  21. 21. マテリアルでロードされるテクスチャ - パターン1 TextureSampleParameter2Dで「緑」テクスチャを貼ったマ テリアル
  22. 22. マテリアルでロードされるテクスチャ - パターン1 結果 ロードされます。問題なし。
  23. 23. マテリアルでロードされるテクスチャ パターン2 マテリアルインスタンスで上書き
  24. 24. マテリアルでロードされるテクスチャ - パターン2 TextureSampleParameter2Dで「緑」を貼ったマテリアル
  25. 25. マテリアルでロードされるテクスチャ - パターン2 そこから子マテリアルインスタンスを作成してテクスチャを 「赤」で上書き。
  26. 26. マテリアルでロードされるテクスチャ - パターン2 この「赤」のマテリアルインスタンスのみを貼り付けて使用 します。 親 子
  27. 27. マテリアルでロードされるテクスチャ - パターン2 結果 実際には使用していない親マテリアルの「緑」テクスチャも ロードされています。
  28. 28. マテリアルでロードされるテクスチャ - パターン2 使用するマテリアルインスタンスで使っていなくても、親マ テリアルが使用しているだけでロードされてしまいます。
  29. 29. マテリアルでロードされるテクスチャ - パターン2 親マテリアルで使用するテクスチャは、ロードされても問題 のない 1x1のような小さいテクスチャを貼り付けておきましょう。
  30. 30. マテリアルでロードされるテクスチャ パターン3 中間のマテリアルインスタンス
  31. 31. マテリアルでロードされるテクスチャ - パターン3 TextureSampleParameter2Dで「緑」を貼ったマテリアル
  32. 32. マテリアルでロードされるテクスチャ - パターン3 そこから子マテリアルインスタンスを作成してテクスチャを 「赤」で上書き。 更に子マテリアルインスタンスを作成して「緑」で上書き
  33. 33. マテリアルでロードされるテクスチャ - パターン3 緑→赤→緑 で子マテリアルインスタンスを作成。 この一番下の「緑」マテリアルインスタンスを使用する 親 子 子子
  34. 34. マテリアルでロードされるテクスチャ - パターン3 結果 実際には使用していない中間マテリアルの「赤」テクスチャ もロードされています。
  35. 35. マテリアルでロードされるテクスチャ - パターン3 マテリアルの親子階層全てのテクスチャがロードされます。 マテリアルインスタンスの親子付けを構築する際は、親マ テリアルのテクスチャ設定に気をつけましょう
  36. 36. マテリアルでロードされるテクスチャ パターン4 TextureSampleに残っていた設定
  37. 37. マテリアルでロードされるテクスチャ - パターン4 「赤」を設定されたTextureObjectから、TextureSampleす るだけのノード構成。
  38. 38. マテリアルでロードされるテクスチャ - パターン4 しかしよく見ると、TextureSampleノードのデフォルト値に 「緑」が付きっぱなし! (でも一切使用されない)
  39. 39. マテリアルでロードされるテクスチャ - パターン4 結果 「緑」テクスチャもロードされます。一切使用されないですが ……
  40. 40. マテリアルでロードされるテクスチャ - パターン4 どうやったらこのノード出来るの?
  41. 41. マテリアルでロードされるテクスチャ - パターン4 1. TextureSampleノードを作って「緑」テクスチャを設定し ます
  42. 42. マテリアルでロードされるテクスチャ - パターン4 2. やっぱり複数箇所で同じテクスチャ使いたい!となりまし た。 Texピンから引っ張って「TextureObject」ノードを作ります
  43. 43. マテリアルでロードされるテクスチャ - パターン4 3. 調整していくと「赤」を使う事に決まったので TextureObjectを「赤」にします
  44. 44. マテリアルでロードされるテクスチャ - パターン4 4. この手順で一番初めに設定したTextureSampleノードに 古いテクスチャが残ったままになります
  45. 45. マテリアルでロードされるテクスチャ - パターン4 もうひとつのパターン。 TextureObjectノードからTextureSampleノードを出しま す。
  46. 46. マテリアルでロードされるテクスチャ - パターン4 この時、コンテンツブラウザでテクスチャが選択されている と、そのアセットが設定されます!
  47. 47. マテリアルでロードされるテクスチャ - パターン4 修正方法
  48. 48. マテリアルでロードされるテクスチャ - パターン4 そのままでは編集出来ないようになっているので……
  49. 49. マテリアルでロードされるテクスチャ - パターン4 Texピンの接続を一旦切ると編集出来るようになります。 その後、TextureSampleノードのTexture欄をクリアします。
  50. 50. マテリアルでロードされるテクスチャ - パターン4 クリア出来たら再度Texピンを繋いで完了!
  51. 51. マテリアルでロードされるテクスチャ - パターン4 TexピンからTextureObjectを出したい時は、一旦テクス チャ設定をクリアする癖を付けましょう。 後はReference Viewerで確認しましょう(後述)
  52. 52. マテリアルでロードされるテクスチャ パターン5 マテリアル関数のPreview
  53. 53. マテリアルでロードされるテクスチャ - パターン5 マテリアル関数の引数Texture2DのPreview用に「緑」テク スチャを設定します。 (このマテリアル関数内でのみプレビューする用)
  54. 54. マテリアルでロードされるテクスチャ - パターン5 そのマテリアル関数を使う所で、引数にTextureObjectで 「赤」を渡します。
  55. 55. マテリアルでロードされるテクスチャ - パターン5 結果 Previewにしか繋いでない筈の「緑」テクスチャがロードさ れます。
  56. 56. マテリアルでロードされるテクスチャ - パターン5 対処方法
  57. 57. マテリアルでロードされるテクスチャ - パターン5 ● Preview用は消しておいて、Developフォルダにマテリ アル関数確認用のマテリアル作るか…… ● Preview用の軽い共通テクスチャを用意するとか ……? (でもエンジンコンテンツのマテリアル関数にもこのパターン一杯ある……)
  58. 58. マテリアルでロードされるテクスチャ パターン6 どこにも繋がってないノード
  59. 59. マテリアルでロードされるテクスチャ - パターン6 そもそもどこにも繋がってなくて使ってない。 けどノードだけ残ってる
  60. 60. マテリアルでロードされるテクスチャ - パターン6 結果 どこにも繋がってない「緑」テクスチャがロードされた。
  61. 61. マテリアルでロードされるテクスチャ パターン7 BPで上書き
  62. 62. マテリアルでロードされるテクスチャ - パターン7 「緑」テクスチャをくっつけたマテリアルを用意。 メッシュエディターでそのマテリアルを設定。
  63. 63. マテリアルでロードされるテクスチャ - パターン7 新規のBPを作って先程のメッシュを設定します
  64. 64. マテリアルでロードされるテクスチャ - パターン7 今度は「赤」テクスチャだけのマテリアルを用意。 BPのメッシュ欄マテリアルに設定。デフォルトのマテリアル を上書きします。
  65. 65. マテリアルでロードされるテクスチャ - パターン7 こんな感じ メッシュデフォルトのマテ リアルを上書き
  66. 66. マテリアルでロードされるテクスチャ - パターン7 結果 BPで「赤」に上書きしたけど、デフォルトマテリアルの「緑」 テクスチャも読み込まれます
  67. 67. マテリアルでロードされるテクスチャ - パターン7 同じメッシュから、マテリアルでカラーバリエーションを作る 際はご注意を……
  68. 68. マテリアルでロードされるテクスチャ パターン8 レベル上で上書き
  69. 69. マテリアルでロードされるテクスチャ - パターン8 先ほどと同じようにBPに「緑」テクス チャのメッシュを登録。 今度はBP上ではなく、レベル上で 「赤」テクスチャのマテリアルに差し 替え。
  70. 70. マテリアルでロードされるテクスチャ - パターン8 結果 同じように「緑」テクスチャも読み込まれます
  71. 71. マテリアルでロードされるテクスチャ まとめ
  72. 72. マテリアルでロードされるテクスチャ - まとめ 割と簡単に使ってないテクスチャが読み込まれます。 細かく注意していきましょう。
  73. 73. マテリアルでロードされるテクスチャ エディター上での確認
  74. 74. マテリアルでロードされるテクスチャ - エディター上での確認 コンテンツブラウザでアセットを右クリック。 「Reference Viewer」で何が読み込まれるか確認できま す。 右側のアセットが同時に 読み込まれる
  75. 75. マテリアルでロードされるテクスチャ 読み込んだテクスチャリストを表示
  76. 76. マテリアルでロードされるテクスチャ - 読み込んだリストを表示 スタンドアローン起動、もしくはDevelopパッケージ版で起動 します。 起動して確認したいタイミングで、「@」キーを押したら出てく るコンソールから「Obj List Class=Texture2D」
  77. 77. マテリアルでロードされるテクスチャ - 読み込んだリストを表示 コマンドを打ち込むとログに出力されます。 「@」キーを2回押すと枠が拡張されてログが確認出来ま す。 (もしくはプロジェクトフォルダのSaved/Logs/内)
  78. 78. もくじ ● はじめに ● マテリアルでロードされるテクスチャ ○ パターン1~8 ● Switch / Override ○ パターン1~4 ● 痒いところのTips ○ Texture枚数 ○ Vertex Interpolator
  79. 79. Switch / Override Static Switch Parameter もしくは Static Bool Parameter ノード。 子マテリアルインスタンス側でフラグを操作して処理を変更 することが出来ます。
  80. 80. Switch / Override もしくは、子マテリアルインスタンス側で変更出来るBlend ModeやShading Model, Two Sidedなど。
  81. 81. Switch / Override について。
  82. 82. Switch / Override UE4マテリアル触る人のバイブル。 ● 大規模タイトルにおけるエフェクトマテリアル運用 (SQEX 大阪: 林武尊様) ○ https://www.slideshare.net/EpicGamesJapan/sqex-ue4dd
  83. 83. Switch / Override 「分岐を変えると別シェーダーになり」 引用: https://www.slideshare.net/EpicGame sJapan/sqex-ue4dd
  84. 84. Switch / Override UE4マテリアル触る人のバイブル。 ● マテリアルとマテリアルインスタンスの仕組みと問題点 の共有 (Epic Games Japan: 篠山範明) ○ https://www.slideshare.net/EpicGamesJapan/epic-games-japan-ue4dd
  85. 85. Switch / Override 「データサイズやロード時間」「同一組み合わせのシェーダ は一つのインスタンスのみ」 引用: https://www.slideshare.net/EpicGamesJapan/epic-games-japan-ue4dd
  86. 86. Switch / Override 影響するのは ディスクサイズ?(+ロード時間) シェーダーメモリ? レンダリング時は同じシェーダー? マテリアルインスタンスが兄弟の時は?
  87. 87. Switch / Override 2つのスライド。UE4バージョン4.13~4.14 →2016年11月 Today 2019年3月 現在の4.21だと? →結論を先に出しますが、バージョンで挙動に違いはあり ませんでした。
  88. 88. Switch / Override 気になったので調べました
  89. 89. Switch / Override 確認方法
  90. 90. Switch / Override - 確認方法 マテリアル ● Static Switch Parameter を用意。テクスチャ使うかどう か。デフォルトOFF。 ● デフォルトOpaque ● この子マテリアル インスタンスのみで 調べます ○ (マスターマテリアルは 共通です)
  91. 91. Switch / Override - 確認方法 メモリ系はstat系のコマンドを使用します。 「stat shaders」と「stat memory」
  92. 92. Switch / Override - 確認方法 ● Num Shader Resources Loaded ○ 読み込んだシェーダーのリソース数 ● PixelShader Memory ○ ピクセルシェーダーのメモリ量
  93. 93. Switch / Override - 確認方法 ディスクサイズはパッケージングした結果で確認します。
  94. 94. もくじ ● はじめに ● マテリアルでロードされるテクスチャ ○ パターン1~8 ● Switch / Override ○ パターン1~4 ● 痒いところのTips ○ Texture枚数 ○ Vertex Interpolator
  95. 95. Switch / Override パターン1 Switch ON→OFF→ON
  96. 96. Switch / Override - パターン1 子マテリアルインスタンスでON。 更にその子マテリアルインスタンスでOFF 親 子 子子 ① ② ③ 数字の順にロードし ていきます
  97. 97. 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だと 同じシェーダーが走ってる
  98. 98. Switch / Override パターン2 プロパティオーバーライド Opaque→Masked→Opaque
  99. 99. Switch / Override - パターン2 子マテリアルインスタンスでMasked。 更にその子マテリアルインスタンスでOpaque。 親 子 子子 ① ② ③
  100. 100. 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
  101. 101. Switch / Override - パターン2 ここまでのまとめ ● 途中でSwitch等の切り替えがあっても、最終的に同じ シェーダーの組み合わせなら、 ○ シェーダーのメモリを喰わない ○ レンダリング時のシェーダーは同じものが使用される ● ただ、Switch結果が同じシェーダーになったとしても、 Switchの操作が存在するとディスクサイズは増える
  102. 102. Switch / Override パターン3 末端でSwitch操作
  103. 103. Switch / Override - パターン3 「マテリアルとマテリアルインスタンスの仕組みと問題点の 共有」スライドの左側の例 引用: https://www.slideshare.net/EpicGamesJapan/epic-games-japan-ue4dd
  104. 104. Switch / Override - パターン3 ツリー ① ② ③ ④ ⑤ ⑥ ⑦ 末端でSwitchや プロパティ操作
  105. 105. 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
  106. 106. Switch / Override パターン4 中間でSwitch操作
  107. 107. Switch / Override - パターン4 「マテリアルとマテリアルインスタンスの仕組みと問題点の 共有」スライドの右側の例 引用: https://www.slideshare.net/EpicGamesJapan/epic-games-japan-ue4dd
  108. 108. Switch / Override - パターン4 ツリー ① ② ③ ④ ⑤ ⑥ ⑦ 中間でSwitchや プロパティ操作
  109. 109. 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
  110. 110. Switch / Override まとめ
  111. 111. Switch / Override - まとめ 末端でSwitch/プロパティ操作と、 中間でSwitch/プロパティ操作
  112. 112. Switch / Override - まとめ 最終的な末端のマテリアルインスタンスを使用していると、 どちらのパターンでもランタイムのメモリや描画時のシェー ダーに差は無い。 マスターマテリアルさえ同じなら、兄弟インスタンスでも同じ シェーダーを引っ張ってくれる。
  113. 113. Switch / Override - まとめ 影響が出てくるのはディスクサイズ。 パッケージのサイズや、ロード時間に影響する。 ● 末端でSwitch: 7,244 KB ● 中間でSwitch: 3,636 KB
  114. 114. Switch / Override - まとめ 今回は末端が4つでしたが、これが数百個とかになってくる と…… 初めから管理しておく方が良い事が多いので早めの設計 を。 逆に、どうしても末端でSwitch入れたい場合は最悪ディス クサイズのみの影響に留まります。担当者と要相談。
  115. 115. もくじ ● はじめに ● マテリアルでロードされるテクスチャ ○ パターン1~8 ● Switch / Override ○ パターン1~4 ● 痒いところのTips ○ Texture枚数 ○ Vertex Interpolator
  116. 116. 痒いところのTips - Texture枚数 1マテリアルに使えるテクスチャ枚数は?
  117. 117. Texture枚数 そのまま使うと13枚くらいで打ち止め。 (枚数はShading Modelによって変化) エラーが出るようになります。
  118. 118. Texture枚数 このエラーは「テクスチャ枚数の限界」ではなく、 TextureSamplerが最大16個までしか使えない。というエ ラー。 ● TextureSampler ○ シェーダー内部でテクスチャをどの設定で読み込み、使用す るかのパラメーター
  119. 119. Texture枚数 TextureSampleノードのSamplerを「Shared」系にすれば 共通のTextureSamplerが使用され、その枠を消費する事 が無くなります。
  120. 120. Texture枚数 いくらでも使える!
  121. 121. Texture枚数 (とはいえ、特定のハードウェアではテクスチャ枚数に限界 があるので注意してください)
  122. 122. Texture枚数 ただしSharedを使うと、一部のテクスチャ設定が無視さ れ、固定された設定になります。 ● 固定される設定 ○ Filter: “World” TextureGroupの設定 ○ X-Axis Tiling Method: Wrap or Clamp (どちらか指定) ○ Y-Axis Tiling Method: Wrap or Clamp (どちらか指定) ○ LOD Bias: “r.MipMapLODBias”の値
  123. 123. Texture枚数 Texture Samplerを使用している数は、「ウィンドウ」→ 「Stats」から表示される欄に表示されます。 この例では「4/16」 4つ使用中。
  124. 124. もくじ ● はじめに ● マテリアルでロードされるテクスチャ ○ パターン1~8 ● Switch / Override ○ パターン1~4 ● 痒いところのTips ○ Texture枚数 ○ Vertex Interpolator
  125. 125. Vertex Interpolator 頂点シェーダーからピクセルシェーダーへパラメーターを渡 せるノード。
  126. 126. Vertex Interpolator 主な用途としては、頂点シェーダーでしか使えないパラメー ターを渡したりします。 Pre-Skinned系が良く使用されるかと思います。
  127. 127. Vertex Interpolator ただし、渡せる制限があります。 TexCoordと合わせて、Vector4個(=Scalar16個)まで。 Statsで確認できます。
  128. 128. Vertex Interpolator TexCoordノードはCoordinate Index1種類に付きScalar2 個分使用します。 Coordinate Index 0と1の 2種使っているので、 2種 × Scalar2 = Scalar4
  129. 129. Vertex Interpolator Vertex Interpolatorノードで使用するScalarの数は、 引数の要素数によって変わります RGの2種でScalar 2 RGBの3種でScalar 3
  130. 130. Vertex Interpolator Vertex Interpolateノードの注意点!
  131. 131. Vertex Interpolator 下記のノード、同じ構成をしているのでコンパイル時に共通 化されてScalar3個になるかと思いきや……
  132. 132. Vertex Interpolator 別々の物と認識されてScalar 9個使用されます!
  133. 133. Vertex Interpolator 回避する方法
  134. 134. Vertex Interpolator マテリアル関数に閉じ込めます。
  135. 135. Vertex Interpolator このマテリアル関数ならいくら使っても増えません! (これだと同一のノードと認識される模様)
  136. 136. 以上!

×