Unreal Engine 5 における レンダリング & デバッグTips

332.4K Views

December 21, 23

スライド概要

Unreal Engine 5は早期アクセスから約2年が経ち、弊社でもエンジンを活用したサンプルやタイトルを制作している上で様々な改善に取り組んでいます。
UE5の新機能はリッチな表現を比較的実現しやすくなりましたが、パフォーマンスのための各種調整はまだまだ知見が溜まっておらず難しい状態です。
本スライドでは現状の知見、調整方法、開発Tipsを共有させて頂きます。
※本ドキュメントは UE5 Deep Dive 2023にて講演した資料を配布用に編集したものです

profile-image

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

シェア

またはPlayer版

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

関連スライド

各ページのテキスト
1.

Unreal Engine 5 における レンダリング & デバッグTips Epic Games Japan Software Engineer, Developer Relations 2023 Private & Confidential Yutaro Sawada

2.

目的

3.

レンダリングシステム周りの機能 内容 Nanite、Lumen、VSM等について その他開発Tips

4.

レンダリング システム ・UE5のレンダリングスレッドの構成 ・RDG Insights ・PSO Precaching

5.

レンダリング関連スレッド(CPU)について Game Thread ゲームの処理 Render Thread レンダリングに関する処理 RHI Thread 各種プラットフォーム対応・APIの処理

6.

Submission Pipeline RHI Thread 各種プラットフォーム対応・APIの処理 各種プラットフォームやAPIの対応 Submission Thread コマンドの送信 Interrupt Thread 割り込み処理 GPU待ち、タイムアウト、例外、 タイムスタンプ処理等 ブロッキングを減らすためにRHIの処理を分離(D3D12や一部プラットフォームで対応) コンソールコマンド(デフォルト): rhi.UseSubmissionThread 2

7.

UE5.3ではデフォルト有効 Interrupt Threadはマルチスレッド動作時にデフォルト有効 Submission Threadはコンソール変数にて設定可能でデフォルト有効 UE5.1だと-nothreading オプションが有効な場合に Submission Threadが作成されクラッシュする問題が発生(UE5.2のCL24789790にて修正) UE5.3にてmGPUの場合にもデフォルト有効(CL25265905)

8.

レンダリングシステム(CPU)について Game Thread ゲームの処理 Render Thread レンダリングに関する処理 RHI Thread 各種プラットフォーム対応・APIの処理 各種プラットフォームやAPIの対応 Submission Thread コマンドの送信 Interrupt Thread 割り込み処理

9.

レンダリングシステム(CPU)について Game Thread Render Thread RHI Thread Submission Thread Interrupt Thread Render Dependency Graph (RDG) 描画パスを作成、 最適なリソース管理を行うためのAPI

10.

RDG Insights

11.

RDG Insights - キャプチャ方法 RDG Insightsのプラグインを有効化 引数-trace=rdg,default で起動(defaultはCPU等を表示) またはエディタの右下メニューからRDGチャンネルを設定 その後、Traceをスタート→Open Live Sessionで開く

12.

RDG Insights - RDGはトレースの一番下に

13.

RDG Insights - 3つの分類

14.

RDG Insights - 3つの分類 スコープ

15.

RDG Insights - 3つの分類 パス

16.

RDG Insights - パス 水色はCompute、赤色はRaster、 一段下の緑色がAsync Compute

17.

RDG Insights - 3つの分類 リソース

18.

RDG Insights - リソース

19.

RDG Insights - 3つの分類 スコープ パス リソース

20.

RDG Insights - リソースの色変更 ・デフォルト設定はタイプ表示 緑色がBuffer、水色がTexture

21.

RDG Insights - サイズの大きさで可視化 ・右クリックメニューからサイズ表示に変更可能 サイズが大きいものほど赤色に

22.

RDG Insights

23.

RDGに関する、おすすめ資料 最近開催されていたコミュニティの勉強会にて RDG等について非常に分かりやすく解説して頂いていました ・UnrealEngine レンダリングシステムとその拡張 https://www.docswell.com/s/strvert/K38NEM-rendering-system-and-extensions-in-unrealengine 公式資料 ・Unreal Engine でのレンダリング依存関係グラフ | Unreal Engine 5.3 ドキュメント https://docs.unrealengine.com/5.3/ja/render-dependency-graph-in-unreal-engine/ ・RDG 101 - A Crash Course https://epicgames.ent.box.com/s/ul1h44ozs0t2850ug0hrohlzm53kxwrz

24.

PSO Precaching

25.

PSO Precaching - 事前キャッシュ UE5.3にてデフォルト有効化(r.PSOPrecaching 1) レンダリング時のPSO (Pipeline State Object)を 主にロード(PostLoad)のタイミングでキャッシュするための新しい仕組み 旧PSOキャッシュシステムもありましたが、生成のために事前プレイが必要 User Generated Content(UGC)のようなゲームでは用意できないケースも

26.

PSO Precachingの利点 ・ランタイムで解決 PostLoad()のタイミングで行うため、 事前にComponentのロードを行う場合有効 -> ロードと表示が同時の場合、効果的には利用できない

27.

ヒッチの対策 ・PSOの準備が間に合わない場合 従来から描画をスキップすことでヒッチを回避する r.SkipDrawOnPSOPrecaching 設定があったが、 DepthPassのみPSOが間に合い、BasePassは間に合わないといったケースでは 整合性が合わないことから描画不具合が発生する問題があった 新たに追加された r.PSOPrecache.ProxyCreationWhenPSOReady 設定はプリミティブ単位でスキップ ポッピングが起きてしまう可能性はあるが、ヒッチは回避

28.

CollectPSOPrecache - StaticMeshComponent void UStaticMeshComponent::PostLoad() void UPrimitiveComponent::PrecachePSOs() void UStaticMeshComponent::CollectPSOPrecacheData( ) ... void UStaticMeshComponent::CollectPSOPrecacheDataImpl( ) ...

29.

CollectPSOPrecache - StaticMeshComponent void UStaticMeshComponent::PostLoad() void UPrimitiveComponent::PrecachePSOs() void UStaticMeshComponent::CollectPSOPrecacheData( ) ... void UStaticMeshComponent::CollectPSOPrecacheDataImpl( ) ...

30.

CollectPSOPrecache - StaticMeshComponent void UStaticMeshComponent::PostLoad() void UPrimitiveComponent::PrecachePSOs() void UStaticMeshComponent::CollectPSOPrecacheData( ) ... void UStaticMeshComponent::CollectPSOPrecacheDataImpl( ) ... FComponentPSOPrecacheParams

31.

CollectPSOPrecache - StaticMeshComponent void UStaticMeshComponent::PostLoad() void UPrimitiveComponent::PrecachePSOs() void UStaticMeshComponent::CollectPSOPrecacheData( ) ... void UStaticMeshComponent::CollectPSOPrecacheDataImpl( ) ... FComponentPSOPrecacheParams

32.

CollectPSOPrecache - 各Component それぞれのコンポーネントで実装されている → 独自の描画コンポーネントがある場合は対応が必要

33.

PSO PrecachingのStats パッケージ化したゲームでr.PSOPrecache.Validationを有効化 ValidationはReadOnly設定のため以下のような引数起動でオーバーライドすると確認可能 ./GAME.exe -ini:Engine:[ConsoleVariables]:r.PSOPrecache.Validation=2 Stat用コンソールコマンド:stat PSOPrecache

34.

PSO Cache -clearPSODriverCache GPUドライバ側のキャッシュでヒッチが隠されているケースも 起動引数 -clearPSODriverCache でキャッシュファイルを削除 Local AppData (C:\Users\%USERNAME%\AppData\) 以下に作成されているキャッシュを削除

35.

レンダリングシステムの今後のロードマップ Unreal Fest Day 2 | Livestream 3 https://www.youtube.com/watch?v=JS5N41F4fZQ

36.

各機能について その他開発Tips ・Nanite ・Lumen ・VSM ・その他開発Tips

37.

Nanite

38.

仮想化ジオメトリ ストリーミングを活用し 高精細メッシュを描画

39.

Naniteの概要 仮想化ジオメトリ ・メッシュをクラスタ単位に分割し階層構造を構築する ・クラスタ単位でLODのように描画メッシュを切り替える ・必要なデータのみをメモリに送るようにストリーミング

40.

Naniteが実現すること ポイント ・高精細なメッシュから欲しい必要な詳細度で描画 ・独自のソフトウェアラスタライザとレンダリングパイプラインにより マルチビューで描画可能

41.

最近のアップデート UE5.0から処理速度や品質向上、また各種機能への対応アップデートが行われている https://www.docswell.com/s/EpicGamesJapan/ KDE2Q6-UE5_GTMF23_Rendering_PCG

42.

様々なマテリアルに対応しましたが... 実情としてMaskedなどは非常に重く、 特に60fpsを目指す場合は不透明(Opaque)描画が好ましい 弊社タイトルでも樹木は、ポリゴンで葉を作り不透明で描画 https://www.unrealengine.com/ja/tech-blog/ bringing-nanite-to-fortnite-battle-royale-in-chapter-4 ※GDC2023にて公開した Electric Dream環境デモの樹木はMasked Material 全く使えない、ということではなく注意が必要

43.

PCGを利用したLevelを作成

44.

検証用PCG Graph

45.

検証用PCG Graph

46.

検証用PCG Graph

47.

検証用PCG Graph

48.

検証用PCG Graph

49.

検証用PCG Graph

50.

検証用PCG Graph

51.

検証用PCG Graph

52.

SM_EuropeanHornbeam_Field_01 Electric Dreamで利用されている木のアセット ・Masked Material ・位置で色変わる仕組みや自然な揺れ(WPO)のセットアップ済み Substrateマテリアルのため 他プロジェクトで利用する場合対応が必要 (親マテリアルのM_Foliage内のLegacy Conversionノードを削除)

53.

MF_WorldspaceColorVariation

54.

テストシーンからみるNanite ゲーム環境 ・Maskedマテリアル ・WPO有り ・PC Developmentビルド ・1080p ・計測環境 CPU: AMD Ryzen Threadripper PRO 3995WX GPU: NVIDIA GeForce RTX 3080 Memory: 256GB

55.

WPOとMaskedを取り除くと... ・量が多い、WPO自体重いというのもありますが、非常に影響が大きい 元マテリアル WPO要素を削除 更にOpaqueへ

56.

テストシーンからみるNanite ・Naniteが関連してくる大きいものは... ・VisBuffer ・Shadow Depth ・Lumen (分散されるので1フレームだと大きくでない) 以下コンソールコマンドを有効化すると マテリアルごとのラスタライズ時間を確認可能 r.Nanite.ShowMeshDrawEvents 1

57.

Naniteのラスタライザについて ・SW(ソフトウェア)とHW(ハードウェア)ラスタライズ GPUのハードウェアラスタライズは極小のポリゴンの場合遅くなってしまうため、 場合によりSWでラスタライズを行っている。(以下設定によりHWとSWの振り分け) r.Nanite.MinPixelsPerEdgeHW 32 ・以下設定が0の場合にソフトウェアラスタライザがオフに r.Nanite.ComputeRasterization 1 ※対応プラットフォームの場合Async Computeで実行される 逐次実行とする場合は以下設定を0に r.Nanite.AsyncRasterization 1

58.

Naniteの最適化の指針 ・オーバードローを減らす ・Masked等 Programmable Rasterizer は最小限に

59.

OpaqueとMaskedの比較 ・Nanite Visualization -> Overdraw Maskedはラスタライズが重く、Overdrawを引き起こす

60.

WPOを距離によって無効化 StaticMeshComponent単位でWPOを無効化する距離を設定(Disable Distance) Nanite Visualization -> Evaluate WPOでWPOが評価されるマテリアルを可視化

61.

Naniteの制限 右はPCGで大量に配置して壊れた図 右図では以下設定が超えている ※カリング通過ノードや最大表示クラスタ r.Nanite.MaxNodes r.Nanite.MaxVisibleClusters 最大PoolSizeによる制限も r.Nanite.Streaming.StreamingPoolSize

62.

Naniteの表示エラー メッシュ単位で作られているHLODのようなものなので、 場合によってメッシュのシルエットが壊れてしまうケースも Naniteの三角形の大きさをピクセル単位で指定 小さい値(0.1など)を設定すると高精細なクラスタを表示 →ピクセルあたりの詳細度をあげる r.Nanite.MaxPixelsPerEdge 1

63.

ハイポリなモデルの表示には有用 ・最適なクラスタ単位で描画されるため負荷に関しては緩やか(出力解像度に依存) ・Lumen、VSMなどはNaniteに最適化されている ※右図は非Nanite化した状態 LODを作れば多少最適化可能だが これをエンジンが解決してくれるのは強み

64.

Nanite Toolsの廃止 コンテンツブラウザで代替可能との判断からNanite Toolsは廃止

65.

Non Nanite Meshのフィルタ方法 コンテンツブラウザの検索バーからプロパティの値でフィルタリングが可能

66.

Non Nanite Meshのフィルタ方法 Columnsビューでソート表示なども可能

67.

Non Nanite Meshのフィルタ方法 右クリックメニューから、まとめて有効化

68.

フィルタの保存 検索窓の右にある+アイコンからフィルタの保存が可能

69.

Lumen

70.

ベイク無しで間接光を表現

71.

Lumenの仕組み https://www.docswell.com/s/EpicGamesJapan/5EV87K-UE5_Lumen101

72.

Lumen おさらい

73.

最近のアップデート Lumenに関しても処理速度や品質向上、また各種機能への対応アップデートが行われている https://www.docswell.com/s/EpicGamesJapan/ KDE2Q6-UE5_GTMF23_Rendering_PCG

74.

Lumenカードの解像度 ミラーマテリアルを床に割り当て、スクリーントレースをオフにした状態

75.

FLumenSurfaceCacheUpdateMeshCardsTask 最大1024の解像度で動的に変更される ・設定できる値 CardMinResolution以下が要求されると真っ黒に(デフォルト:4) r.LumenScene.SurfaceCache.CardMinResolution カードのOBBのサイズ(XまたはYの最大値)と距離に応じたスケール(デフォルト:100) r.LumenScene.SurfaceCache.CardTexelDensityScale カードのOBBのサイズ(XまたはYの最大値)に応じたMax値を求める係数(デフォルト:0.2) r.LumenScene.SurfaceCache.CardMaxTexelDensity 遠くでも描画したい場合はTexelDensityを両方を上げる 逆に軽量化したい場合は両方を下げる

76.

Lumenの最適化 基本は、スケーラビリティの設定 アセット側で可能な対応としては... Lumenカードの描画負荷を下げる事が必要に ・Static Meshを可能な限りNanite化 ・Naniteの軽量化(LODを上げる) ・Lumenカードをマージ ・Lumenカードの解像度が下がるように調整

77.

Virtual Shadow Maps

78.

Virtual Textureの仕組みを活 用したShadow Map

79.

Virtual Shadow Maps VSMはデフォルト設定からPoolSizeが512MB等消費メモリや負荷が高く 使用を断念されている声も頂いているため、 今回調整方法と、設定を理解するための基礎的な挙動を紹介

80.

Shadow mapの基礎

81.

Shadow mapの基礎

82.

VSMの処理 Shadow Mapの 作成 + Shadow Mapから 描画

83.

VSMの処理 Shadow Mapの 作成 + Shadow Mapから 描画

84.

Virtual Shadow Mapsの特徴 必要な場所に必要な解像度のTextureを利用するVirtual Textureを応用 高解像Shadow Mapを利用 Page 128 × 128

85.

UEのライトについて 各種ライトによって動作が一部異なる

86.

VSMの挙動別 Local Light ・Point Light ・Spot Light ・Rect Light Directional Light ・Directional Light

87.

VSMの挙動別 Local Light ・Point Light ・Spot Light ・Rect Light Directional Light ・Directional Light

88.

Spot Lightの例 ・

89.

r.shadow.virtual.showstats 1

90.

Spot Light - Shadow Depth ・

91.

Spot Light

92.

Point Light & Rect Light

93.

Point Light & Rect Light - Cube map状態

94.

Point Light & Rect Light

95.

VSMの挙動別 Local Light ・Point Light ・Spot Light ・Rect Light Directional Light ・Directional Light

96.

複数のライトの場合 ビューから見てライトの影響がある場所のPage(Shadow map)がリクエストされる → ライトが多くなるほど、Page数や必要な更新が増える

97.

VSMの問題を解決する2つの特徴 キャッシュ システム Pageを VSM全体で管理

98.

VSMの問題を解決する2つの特徴 キャッシュ システム Pageを VSM全体で管理

99.

キャッシュシステム できるだけShadow Mapをキャッシュ (デフォルト:r.Shadow.Virtual.Cache 1)

100.

キャッシュの分離 デフォルト有効化されている r.Shadow.Virtual.Cache.StaticSeparate 1 キャッシュの更新をできるだけ減らすために ・静的なオブジェクト用 ・動的なオブジェクト用 2つのキャッシュを用意

101.

キャッシュの可視化

102.

キャッシュの可視化 青い部分が更新Pages (Invalidated)

103.

キャッシュのエラー Skeletal Meshの Bounds Scaleを0.5で設定した例 更新範囲はBounds Boxを投影する形 ※Skeletal Meshの場合、 Physics Assetを元に生成されている アニメーションによって影が 残ってしまう場合は要確認

104.

VSMの問題を解決する2つの特徴 キャッシュ システム VSM全体での Page管理

105.

VSM全体で行われているPage管理 ライトを置けば置くほど、VSMのShadow Mapが増えてしまう Physical Pages数でVSM全体のShadow Mapの数を制限 r.Shadow.Virtual.MaxPhysicalPages (デフォルト値:4096)

106.

VSM全体で行われているPage管理 すべてのライトのShadow Mapsが単一のプールで管理される ※Separate Static Shadowの場合2つのプール Texture2DArray:

107.

VSMのメモリ Pool Size = (R32 buffer) * 128 * 128 * (MaxPhysicalPages) * (Separate Pool) 512MB = 3 Bytes * 128 * 128 * 4096 * 2

108.

VSMのメモリを少なくするには 1. Max Physical Pagesを減らす ※Page数を超えるようなライトをセットアップすると影が壊れる 2. メモリサイズ優先な場合は、 Separate Staticをオフに(使用メモリが半分に) 3. リクエストPage数がMax Physical Pageを超えないように調整 コンソールコマンドにてサイズ(LOD)のBias調整

109.

VSMのResolutionLodBiasLocal r.Shadow.Virtual.ResolutionLodBiasLocal -1以下に設定するとより細かく、1以上を設定すると荒くなる

110.

VSMのResolutionLodBiasLocalMoving r.Shadow.Virtual.ResolutionLodBiasLocalMoving ~Movingはライトが動いている時にBiasをかける ライトが動くとキャッシュが効かないため、Biasをかけて更新ページを減らす

111.

VSMの挙動別 Local Light ・Point Light ・Spot Light ・Rect Light Directional Light ・Directional Light

112.

VSMの挙動別 Local Light ・Point Light ・Spot Light ・Rect Light Directional Light ・Directional Light

113.

Directional Light

114.

Directional Light 全体にライティング -> カメラから近いほど詳細なPage(Shadow Map)を使用する 基本的にはLocal Lightと同じ仕組みで、 追加要素としてカメラからの距離によってLODを変化させているクリップマップがある コンソールコマンドは、~Directionalといった末尾のものが適用可能 r.Shadow.Virtual.ResolutionLodBiasDirectional r.Shadow.Virtual.ResolutionLodBiasDirectionalMoving

115.

Directional Light - Clip mapの調整 r.Shadow.Virtual.Clipmap.FirstLevel 指定Level以下は同じ大きさのPageを利用(デフォルト:6) - 64 cm (2^6 cm) r.Shadow.Virtual.Clipmap.LastLevel 指定レベルより上はPageを描画しない(デフォルト:22) - 約 40 km (2^22 cm)

116.

Directional Light - Clip mapの調整 r.Shadow.Virtual.Clipmap.FirstLevel 指定Level以下は同じ大きさのPageを利用(デフォルト:6) r.Shadow.Virtual.Clipmap.LastLevel 指定レベルより上はPageを描画しない(デフォルト:22)

117.

r.Shadow.Virtual.Clipmap.FirstLevel 6

118.

r.Shadow.Virtual.Clipmap.FirstLevel 5

119.

r.Shadow.Virtual.Clipmap.FirstLevel 4

120.

Directional Light - Clip mapの調整 r.Shadow.Virtual.Clipmap.FirstLevel 指定Level以下は同じ大きさのPageを利用(デフォルト:6) r.Shadow.Virtual.Clipmap.LastLevel 指定レベルより上はPageを描画しない(デフォルト:22)

121.

r.Shadow.Virtual.Clipmap.LastLevel 22

122.

r.Shadow.Virtual.Clipmap.LastLevel 13

123.

r.Shadow.Virtual.Clipmap.LastLevel 10

124.

Directional Lightまとめ ・LodBiasでLODを調整 r.Shadow.Virtual.ResolutionLodBiasDirectional r.Shadow.Virtual.ResolutionLodBiasDirectionalMoving ・ClipmapLevelで範囲を調整 r.Shadow.Virtual.Clipmap.FirstLevel r.Shadow.Virtual.Clipmap.LastLevel

125.

VSMの処理 Shadow Mapの 作成 + Shadow Mapから 描画

126.

VSMの処理 Shadow Mapの 作成 + Shadow Mapから 描画

127.

Shadow Map Ray Tracing (SMRT) VSMはShadow Mapに対してRaytracingを行い高品質なシャドウ描画を行う トレースするShadow rayはライトの以下パラメータで分散 ・Local Lightの場合: Source Radius ・Directional Lightの場合: Source Angle

128.

SMRT - RayCount パフォーマンスや品質に関わるサンプル数SMRT.RayCount ※デフォルト:8 (0にすると単一サンプルのハードシャドウに) r.Shadow.Virtual.SMRT.RayCountLocal r.Shadow.Virtual.SMRT.RayCountDirectional ・検証(右図) Source Radiusは1.5 RayCountDirectionalを調整

129.

SMRT - RayCountLocal Local Lightが多いと影響が大きくなる r.Shadow.Virtual.SMRT.RayCountLocal ・検証(右図) PCGでメッシュとLightを配置 Source Radiusは100 RayCountLocalを調整

130.

VSMの最適化について 最適化のためには... できるだけキャッシュさせる → キャッシュを無効化するObjectを減らす 広域でキャッシュを活かせない、例として草等はContact Shadowのみを検討 Directional Lightの設定から Contact ShadowのLengthを設定 Static Meshの設定から Dynamic Shadowをオフに Contact Shadowのみ有効化

131.

VSMの最適化機能 ・Distant LightsとOnepass Projectionがデフォルト有効 両方を有効化 ポイントライト:100個配置 RTX4090にて計測

132.

Distant LightsとOnepass Projection ・Distant Lights 影響する領域が小さい遠くのライトの更新頻度を減らす r.shadow.virtual.distantlightmode 1 更新数の調整 r.Shadow.Virtual.MaxDistantUpdatePerFrame 1 ・Onepass Projection 制限を満たすライトをまとめて処理する r.Shadow.Virtual.OnePassProjection 1 ※制限については公式VSMドキュメントワンパス投影に記載 https://docs.unrealengine.com/5.2/ja/virtual-shadow-maps-in-unreal-engine/

133.

最適化について - 5.4~ Pool Sizeに合わせた動的解像度VSM r.Shadow.Virtual.DynamicRes.MaxPagePoolLoadFactor デフォルト: 0.85 プールサイズの85%を超えた場合にPageのLODを調整する 例:PagePoolSizeを4096->100に制限(メモリは512MBから16MBへ削減)

134.

その他機能に関する情報 ・TSR Unreal Engine 5.2 アップデート ~Rendering/PCG~ https://www.docswell.com/s/EpicGamesJapan/ KDE2Q6-UE5_GTMF23_Rendering_PCG#p37 ・Niagara Unreal Engine 5 Niagaraにおける実践的な最適化とスケーラビリティ https://www.youtube.com/watch?v=YcS9CsIvOp0 https://cedil.cesa.or.jp/cedil_sessions/view/2718

135.

Tips

136.

Shader Print UE5の一部のデバッグ表示はShaderPrintで描画 (Compute Shaderで各種リソースを表示用データに変換) r.Nanite.ShowStats r.Shadow.Virtual.ShowStats etc. 一部の表示は調整可能 r.ShaderPrint.FontSize r.ShaderPrint.FontSpacingX r.ShaderPrint.FontSpacingY

137.

Shader Print - 比較的分かりやすい実装 CPP側、CS Shaderにそれぞれ実装が必要 RadianceCacheUpdateStatsがシンプル r.Lumen.ScreenProbeGather.RadianceCache.Stats LumenRadianceCacheDebug.usf その他エンジン実装を確認したい場合は、 ../ShaderPrint.ush で検索すると使用実装が確認可能

138.

Shader Print - CPP側

139.

r.ShaderPrint.Zoom Viewport上でマウスカーソル上を拡大表示する r.ShaderPrint 1 で機能を有効にした後、 r.ShaderPrint.Zoom 1 を設定 ・表示場所を変更 r.ShaderPrint.Zoom.Corner ・ズーム対象のピクセル数 r.ShaderPrint.Zoom.Pixel ・ズームする倍率 r.ShaderPrint.Zoom.Factor

140.

テクスチャの視覚化 - VisualizeTexture/Vis RDGリソースに対応し、リアルタイムで可視化可能(Development builds上) Vis コマンドのみ実行するとHelpとリソース名一覧が表示される VisualizeTexture/Vis <RDGResourceName>[@<Version>] [<Mode>] ~

141.

Vis - Pool Vis Pool : リソース一覧のみ表示 Vis Pool BYNAME : 名前でソート表示 Vis Pool BYSIZE : サイズでソート表示

142.

Vis - BMP ・BMPコマンドで元サイズで画像出力可能 Vis [リソース名] BMP ・右図の例 vis Lumen.SceneAlbedo BMP

143.

Render Resource View サイズ等でソートすると大きいリソースを手軽に早期に発見できるので非常に有用

144.

シェーダ開発Tips - COTFの利用 グローバルシェーダを変更する場合、多くCompileが走ってしまい時間がかかる Cook on the fly(COTF)対応のプラットフォーム上の場合、 パッケージを用意しておけば、変更のあるシェーダのみコンパイルされ適用可能

145.

COTFの利用 - 手順 起動後すぐに確認できるようなシンプルなプロジェクトを用意し、 COTFモードで起動することでイテレーションを速く開発することが可能 手順: 1. ホスト側:クッカーサーバーを起動 ./UnrealEditor-Cmd.exe "xxx.uproject" -run=cook -cookonthefly -targetplatform=Windows 2. ゲーム側:クッカーサーバーのアドレスを指定してパッケージを起動 (アドレスはクッカー起動ログに表示) ./GAME.exe -filehostip=x.x.x.x -windowed ※-windowed(ウィンドウ起動)は必要に応じて

146.

BasePassPixelShader.usfを変更した例 .usf変更後、RestartLevelコマンドで適用可能

147.

グラフィックスデバッグ DumpGPU コマンド RenderDoc etc.

148.

DumpGPUコマンド コマンドdumpgpuを実行することでウェブブラウザで確認できるGPU Dumpを出力 ※エディタ上の場合でもPIE実行後可能

149.

RenderDoc 直近のバージョンだとRenderDocのプラグインの有効化に加えて、 起動引数に -AttachRenderDoc が必要 シェーダのデバッグを行いたい場合、 /Engine/Config/ConsoleVariables.iniの以下コマンドをコメントアウトを取り除く r.ShaderDevelopmentMode=1 r.Shaders.Optimize=0 r.Shaders.Symbols=1 ステップ実行などのデバッグはD3D11のみ対応しているため 追加で -dx11 引数が必要 追記: D3D12の場合、プロジェクト設定からSM5で動作するように切り替えることで デバッグ実行可能との情報を頂きました(SM6のDXIL対応が原因のため)

150.

RenderDoc - Shader Debug D3D11で見れる範囲であればRenderDocがお手軽

151.

レンダリングシステム周りの機能 まとめ Nanite、Lumen、VSM等について その他開発Tips