367.1K Views
December 21, 23
スライド概要
Unreal Engine 5は早期アクセスから約2年が経ち、弊社でもエンジンを活用したサンプルやタイトルを制作している上で様々な改善に取り組んでいます。
UE5の新機能はリッチな表現を比較的実現しやすくなりましたが、パフォーマンスのための各種調整はまだまだ知見が溜まっておらず難しい状態です。
本スライドでは現状の知見、調整方法、開発Tipsを共有させて頂きます。
※本ドキュメントは UE5 Deep Dive 2023にて講演した資料を配布用に編集したものです
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
Unreal Engine 5 における レンダリング & デバッグTips Epic Games Japan Software Engineer, Developer Relations 2023 Private & Confidential Yutaro Sawada
目的
レンダリングシステム周りの機能 内容 Nanite、Lumen、VSM等について その他開発Tips
レンダリング システム ・UE5のレンダリングスレッドの構成 ・RDG Insights ・PSO Precaching
レンダリング関連スレッド(CPU)について Game Thread ゲームの処理 Render Thread レンダリングに関する処理 RHI Thread 各種プラットフォーム対応・APIの処理
Submission Pipeline RHI Thread 各種プラットフォーム対応・APIの処理 各種プラットフォームやAPIの対応 Submission Thread コマンドの送信 Interrupt Thread 割り込み処理 GPU待ち、タイムアウト、例外、 タイムスタンプ処理等 ブロッキングを減らすためにRHIの処理を分離(D3D12や一部プラットフォームで対応) コンソールコマンド(デフォルト): rhi.UseSubmissionThread 2
UE5.3ではデフォルト有効 Interrupt Threadはマルチスレッド動作時にデフォルト有効 Submission Threadはコンソール変数にて設定可能でデフォルト有効 UE5.1だと-nothreading オプションが有効な場合に Submission Threadが作成されクラッシュする問題が発生(UE5.2のCL24789790にて修正) UE5.3にてmGPUの場合にもデフォルト有効(CL25265905)
レンダリングシステム(CPU)について Game Thread ゲームの処理 Render Thread レンダリングに関する処理 RHI Thread 各種プラットフォーム対応・APIの処理 各種プラットフォームやAPIの対応 Submission Thread コマンドの送信 Interrupt Thread 割り込み処理
レンダリングシステム(CPU)について Game Thread Render Thread RHI Thread Submission Thread Interrupt Thread Render Dependency Graph (RDG) 描画パスを作成、 最適なリソース管理を行うためのAPI
RDG Insights
RDG Insights - キャプチャ方法 RDG Insightsのプラグインを有効化 引数-trace=rdg,default で起動(defaultはCPU等を表示) またはエディタの右下メニューからRDGチャンネルを設定 その後、Traceをスタート→Open Live Sessionで開く
RDG Insights - RDGはトレースの一番下に
RDG Insights - 3つの分類
RDG Insights - 3つの分類 スコープ
RDG Insights - 3つの分類 パス
RDG Insights - パス 水色はCompute、赤色はRaster、 一段下の緑色がAsync Compute
RDG Insights - 3つの分類 リソース
RDG Insights - リソース
RDG Insights - 3つの分類 スコープ パス リソース
RDG Insights - リソースの色変更 ・デフォルト設定はタイプ表示 緑色がBuffer、水色がTexture
RDG Insights - サイズの大きさで可視化 ・右クリックメニューからサイズ表示に変更可能 サイズが大きいものほど赤色に
RDG Insights
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
PSO Precaching
PSO Precaching - 事前キャッシュ UE5.3にてデフォルト有効化(r.PSOPrecaching 1) レンダリング時のPSO (Pipeline State Object)を 主にロード(PostLoad)のタイミングでキャッシュするための新しい仕組み 旧PSOキャッシュシステムもありましたが、生成のために事前プレイが必要 User Generated Content(UGC)のようなゲームでは用意できないケースも
PSO Precachingの利点 ・ランタイムで解決 PostLoad()のタイミングで行うため、 事前にComponentのロードを行う場合有効 -> ロードと表示が同時の場合、効果的には利用できない
ヒッチの対策 ・PSOの準備が間に合わない場合 従来から描画をスキップすことでヒッチを回避する r.SkipDrawOnPSOPrecaching 設定があったが、 DepthPassのみPSOが間に合い、BasePassは間に合わないといったケースでは 整合性が合わないことから描画不具合が発生する問題があった 新たに追加された r.PSOPrecache.ProxyCreationWhenPSOReady 設定はプリミティブ単位でスキップ ポッピングが起きてしまう可能性はあるが、ヒッチは回避
CollectPSOPrecache - StaticMeshComponent void UStaticMeshComponent::PostLoad() void UPrimitiveComponent::PrecachePSOs() void UStaticMeshComponent::CollectPSOPrecacheData( ) ... void UStaticMeshComponent::CollectPSOPrecacheDataImpl( ) ...
CollectPSOPrecache - StaticMeshComponent void UStaticMeshComponent::PostLoad() void UPrimitiveComponent::PrecachePSOs() void UStaticMeshComponent::CollectPSOPrecacheData( ) ... void UStaticMeshComponent::CollectPSOPrecacheDataImpl( ) ...
CollectPSOPrecache - StaticMeshComponent void UStaticMeshComponent::PostLoad() void UPrimitiveComponent::PrecachePSOs() void UStaticMeshComponent::CollectPSOPrecacheData( ) ... void UStaticMeshComponent::CollectPSOPrecacheDataImpl( ) ... FComponentPSOPrecacheParams
CollectPSOPrecache - StaticMeshComponent void UStaticMeshComponent::PostLoad() void UPrimitiveComponent::PrecachePSOs() void UStaticMeshComponent::CollectPSOPrecacheData( ) ... void UStaticMeshComponent::CollectPSOPrecacheDataImpl( ) ... FComponentPSOPrecacheParams
CollectPSOPrecache - 各Component それぞれのコンポーネントで実装されている → 独自の描画コンポーネントがある場合は対応が必要
PSO PrecachingのStats パッケージ化したゲームでr.PSOPrecache.Validationを有効化 ValidationはReadOnly設定のため以下のような引数起動でオーバーライドすると確認可能 ./GAME.exe -ini:Engine:[ConsoleVariables]:r.PSOPrecache.Validation=2 Stat用コンソールコマンド:stat PSOPrecache
PSO Cache -clearPSODriverCache GPUドライバ側のキャッシュでヒッチが隠されているケースも 起動引数 -clearPSODriverCache でキャッシュファイルを削除 Local AppData (C:\Users\%USERNAME%\AppData\) 以下に作成されているキャッシュを削除
レンダリングシステムの今後のロードマップ Unreal Fest Day 2 | Livestream 3 https://www.youtube.com/watch?v=JS5N41F4fZQ
各機能について その他開発Tips ・Nanite ・Lumen ・VSM ・その他開発Tips
Nanite
仮想化ジオメトリ ストリーミングを活用し 高精細メッシュを描画
Naniteの概要 仮想化ジオメトリ ・メッシュをクラスタ単位に分割し階層構造を構築する ・クラスタ単位でLODのように描画メッシュを切り替える ・必要なデータのみをメモリに送るようにストリーミング
Naniteが実現すること ポイント ・高精細なメッシュから欲しい必要な詳細度で描画 ・独自のソフトウェアラスタライザとレンダリングパイプラインにより マルチビューで描画可能
最近のアップデート UE5.0から処理速度や品質向上、また各種機能への対応アップデートが行われている https://www.docswell.com/s/EpicGamesJapan/ KDE2Q6-UE5_GTMF23_Rendering_PCG
様々なマテリアルに対応しましたが... 実情としてMaskedなどは非常に重く、 特に60fpsを目指す場合は不透明(Opaque)描画が好ましい 弊社タイトルでも樹木は、ポリゴンで葉を作り不透明で描画 https://www.unrealengine.com/ja/tech-blog/ bringing-nanite-to-fortnite-battle-royale-in-chapter-4 ※GDC2023にて公開した Electric Dream環境デモの樹木はMasked Material 全く使えない、ということではなく注意が必要
PCGを利用したLevelを作成
検証用PCG Graph
検証用PCG Graph
検証用PCG Graph
検証用PCG Graph
検証用PCG Graph
検証用PCG Graph
検証用PCG Graph
検証用PCG Graph
SM_EuropeanHornbeam_Field_01 Electric Dreamで利用されている木のアセット ・Masked Material ・位置で色変わる仕組みや自然な揺れ(WPO)のセットアップ済み Substrateマテリアルのため 他プロジェクトで利用する場合対応が必要 (親マテリアルのM_Foliage内のLegacy Conversionノードを削除)
MF_WorldspaceColorVariation
テストシーンからみるNanite ゲーム環境 ・Maskedマテリアル ・WPO有り ・PC Developmentビルド ・1080p ・計測環境 CPU: AMD Ryzen Threadripper PRO 3995WX GPU: NVIDIA GeForce RTX 3080 Memory: 256GB
WPOとMaskedを取り除くと... ・量が多い、WPO自体重いというのもありますが、非常に影響が大きい 元マテリアル WPO要素を削除 更にOpaqueへ
テストシーンからみるNanite ・Naniteが関連してくる大きいものは... ・VisBuffer ・Shadow Depth ・Lumen (分散されるので1フレームだと大きくでない) 以下コンソールコマンドを有効化すると マテリアルごとのラスタライズ時間を確認可能 r.Nanite.ShowMeshDrawEvents 1
Naniteのラスタライザについて ・SW(ソフトウェア)とHW(ハードウェア)ラスタライズ GPUのハードウェアラスタライズは極小のポリゴンの場合遅くなってしまうため、 場合によりSWでラスタライズを行っている。(以下設定によりHWとSWの振り分け) r.Nanite.MinPixelsPerEdgeHW 32 ・以下設定が0の場合にソフトウェアラスタライザがオフに r.Nanite.ComputeRasterization 1 ※対応プラットフォームの場合Async Computeで実行される 逐次実行とする場合は以下設定を0に r.Nanite.AsyncRasterization 1
Naniteの最適化の指針 ・オーバードローを減らす ・Masked等 Programmable Rasterizer は最小限に
OpaqueとMaskedの比較 ・Nanite Visualization -> Overdraw Maskedはラスタライズが重く、Overdrawを引き起こす
WPOを距離によって無効化 StaticMeshComponent単位でWPOを無効化する距離を設定(Disable Distance) Nanite Visualization -> Evaluate WPOでWPOが評価されるマテリアルを可視化
Naniteの制限 右はPCGで大量に配置して壊れた図 右図では以下設定が超えている ※カリング通過ノードや最大表示クラスタ r.Nanite.MaxNodes r.Nanite.MaxVisibleClusters 最大PoolSizeによる制限も r.Nanite.Streaming.StreamingPoolSize
Naniteの表示エラー メッシュ単位で作られているHLODのようなものなので、 場合によってメッシュのシルエットが壊れてしまうケースも Naniteの三角形の大きさをピクセル単位で指定 小さい値(0.1など)を設定すると高精細なクラスタを表示 →ピクセルあたりの詳細度をあげる r.Nanite.MaxPixelsPerEdge 1
ハイポリなモデルの表示には有用 ・最適なクラスタ単位で描画されるため負荷に関しては緩やか(出力解像度に依存) ・Lumen、VSMなどはNaniteに最適化されている ※右図は非Nanite化した状態 LODを作れば多少最適化可能だが これをエンジンが解決してくれるのは強み
Nanite Toolsの廃止 コンテンツブラウザで代替可能との判断からNanite Toolsは廃止
Non Nanite Meshのフィルタ方法 コンテンツブラウザの検索バーからプロパティの値でフィルタリングが可能
Non Nanite Meshのフィルタ方法 Columnsビューでソート表示なども可能
Non Nanite Meshのフィルタ方法 右クリックメニューから、まとめて有効化
フィルタの保存 検索窓の右にある+アイコンからフィルタの保存が可能
Lumen
ベイク無しで間接光を表現
Lumenの仕組み https://www.docswell.com/s/EpicGamesJapan/5EV87K-UE5_Lumen101
Lumen おさらい
最近のアップデート Lumenに関しても処理速度や品質向上、また各種機能への対応アップデートが行われている https://www.docswell.com/s/EpicGamesJapan/ KDE2Q6-UE5_GTMF23_Rendering_PCG
Lumenカードの解像度 ミラーマテリアルを床に割り当て、スクリーントレースをオフにした状態
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を両方を上げる 逆に軽量化したい場合は両方を下げる
Lumenの最適化 基本は、スケーラビリティの設定 アセット側で可能な対応としては... Lumenカードの描画負荷を下げる事が必要に ・Static Meshを可能な限りNanite化 ・Naniteの軽量化(LODを上げる) ・Lumenカードをマージ ・Lumenカードの解像度が下がるように調整
Virtual Shadow Maps
Virtual Textureの仕組みを活 用したShadow Map
Virtual Shadow Maps VSMはデフォルト設定からPoolSizeが512MB等消費メモリや負荷が高く 使用を断念されている声も頂いているため、 今回調整方法と、設定を理解するための基礎的な挙動を紹介
Shadow mapの基礎
Shadow mapの基礎
VSMの処理 Shadow Mapの 作成 + Shadow Mapから 描画
VSMの処理 Shadow Mapの 作成 + Shadow Mapから 描画
Virtual Shadow Mapsの特徴 必要な場所に必要な解像度のTextureを利用するVirtual Textureを応用 高解像Shadow Mapを利用 Page 128 × 128
UEのライトについて 各種ライトによって動作が一部異なる
VSMの挙動別 Local Light ・Point Light ・Spot Light ・Rect Light Directional Light ・Directional Light
VSMの挙動別 Local Light ・Point Light ・Spot Light ・Rect Light Directional Light ・Directional Light
Spot Lightの例 ・
r.shadow.virtual.showstats 1
Spot Light - Shadow Depth ・
Spot Light
Point Light & Rect Light
Point Light & Rect Light - Cube map状態
Point Light & Rect Light
VSMの挙動別 Local Light ・Point Light ・Spot Light ・Rect Light Directional Light ・Directional Light
複数のライトの場合 ビューから見てライトの影響がある場所のPage(Shadow map)がリクエストされる → ライトが多くなるほど、Page数や必要な更新が増える
VSMの問題を解決する2つの特徴 キャッシュ システム Pageを VSM全体で管理
VSMの問題を解決する2つの特徴 キャッシュ システム Pageを VSM全体で管理
キャッシュシステム できるだけShadow Mapをキャッシュ (デフォルト:r.Shadow.Virtual.Cache 1)
キャッシュの分離 デフォルト有効化されている r.Shadow.Virtual.Cache.StaticSeparate 1 キャッシュの更新をできるだけ減らすために ・静的なオブジェクト用 ・動的なオブジェクト用 2つのキャッシュを用意
キャッシュの可視化
キャッシュの可視化 青い部分が更新Pages (Invalidated)
キャッシュのエラー Skeletal Meshの Bounds Scaleを0.5で設定した例 更新範囲はBounds Boxを投影する形 ※Skeletal Meshの場合、 Physics Assetを元に生成されている アニメーションによって影が 残ってしまう場合は要確認
VSMの問題を解決する2つの特徴 キャッシュ システム VSM全体での Page管理
VSM全体で行われているPage管理 ライトを置けば置くほど、VSMのShadow Mapが増えてしまう Physical Pages数でVSM全体のShadow Mapの数を制限 r.Shadow.Virtual.MaxPhysicalPages (デフォルト値:4096)
VSM全体で行われているPage管理 すべてのライトのShadow Mapsが単一のプールで管理される ※Separate Static Shadowの場合2つのプール Texture2DArray:
VSMのメモリ Pool Size = (R32 buffer) * 128 * 128 * (MaxPhysicalPages) * (Separate Pool) 512MB = 3 Bytes * 128 * 128 * 4096 * 2
VSMのメモリを少なくするには 1. Max Physical Pagesを減らす ※Page数を超えるようなライトをセットアップすると影が壊れる 2. メモリサイズ優先な場合は、 Separate Staticをオフに(使用メモリが半分に) 3. リクエストPage数がMax Physical Pageを超えないように調整 コンソールコマンドにてサイズ(LOD)のBias調整
VSMのResolutionLodBiasLocal r.Shadow.Virtual.ResolutionLodBiasLocal -1以下に設定するとより細かく、1以上を設定すると荒くなる
VSMのResolutionLodBiasLocalMoving r.Shadow.Virtual.ResolutionLodBiasLocalMoving ~Movingはライトが動いている時にBiasをかける ライトが動くとキャッシュが効かないため、Biasをかけて更新ページを減らす
VSMの挙動別 Local Light ・Point Light ・Spot Light ・Rect Light Directional Light ・Directional Light
VSMの挙動別 Local Light ・Point Light ・Spot Light ・Rect Light Directional Light ・Directional Light
Directional Light
Directional Light 全体にライティング -> カメラから近いほど詳細なPage(Shadow Map)を使用する 基本的にはLocal Lightと同じ仕組みで、 追加要素としてカメラからの距離によってLODを変化させているクリップマップがある コンソールコマンドは、~Directionalといった末尾のものが適用可能 r.Shadow.Virtual.ResolutionLodBiasDirectional r.Shadow.Virtual.ResolutionLodBiasDirectionalMoving
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)
Directional Light - Clip mapの調整 r.Shadow.Virtual.Clipmap.FirstLevel 指定Level以下は同じ大きさのPageを利用(デフォルト:6) r.Shadow.Virtual.Clipmap.LastLevel 指定レベルより上はPageを描画しない(デフォルト:22)
r.Shadow.Virtual.Clipmap.FirstLevel 6
r.Shadow.Virtual.Clipmap.FirstLevel 5
r.Shadow.Virtual.Clipmap.FirstLevel 4
Directional Light - Clip mapの調整 r.Shadow.Virtual.Clipmap.FirstLevel 指定Level以下は同じ大きさのPageを利用(デフォルト:6) r.Shadow.Virtual.Clipmap.LastLevel 指定レベルより上はPageを描画しない(デフォルト:22)
r.Shadow.Virtual.Clipmap.LastLevel 22
r.Shadow.Virtual.Clipmap.LastLevel 13
r.Shadow.Virtual.Clipmap.LastLevel 10
Directional Lightまとめ ・LodBiasでLODを調整 r.Shadow.Virtual.ResolutionLodBiasDirectional r.Shadow.Virtual.ResolutionLodBiasDirectionalMoving ・ClipmapLevelで範囲を調整 r.Shadow.Virtual.Clipmap.FirstLevel r.Shadow.Virtual.Clipmap.LastLevel
VSMの処理 Shadow Mapの 作成 + Shadow Mapから 描画
VSMの処理 Shadow Mapの 作成 + Shadow Mapから 描画
Shadow Map Ray Tracing (SMRT) VSMはShadow Mapに対してRaytracingを行い高品質なシャドウ描画を行う トレースするShadow rayはライトの以下パラメータで分散 ・Local Lightの場合: Source Radius ・Directional Lightの場合: Source Angle
SMRT - RayCount パフォーマンスや品質に関わるサンプル数SMRT.RayCount ※デフォルト:8 (0にすると単一サンプルのハードシャドウに) r.Shadow.Virtual.SMRT.RayCountLocal r.Shadow.Virtual.SMRT.RayCountDirectional ・検証(右図) Source Radiusは1.5 RayCountDirectionalを調整
SMRT - RayCountLocal Local Lightが多いと影響が大きくなる r.Shadow.Virtual.SMRT.RayCountLocal ・検証(右図) PCGでメッシュとLightを配置 Source Radiusは100 RayCountLocalを調整
VSMの最適化について 最適化のためには... できるだけキャッシュさせる → キャッシュを無効化するObjectを減らす 広域でキャッシュを活かせない、例として草等はContact Shadowのみを検討 Directional Lightの設定から Contact ShadowのLengthを設定 Static Meshの設定から Dynamic Shadowをオフに Contact Shadowのみ有効化
VSMの最適化機能 ・Distant LightsとOnepass Projectionがデフォルト有効 両方を有効化 ポイントライト:100個配置 RTX4090にて計測
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/
最適化について - 5.4~ Pool Sizeに合わせた動的解像度VSM r.Shadow.Virtual.DynamicRes.MaxPagePoolLoadFactor デフォルト: 0.85 プールサイズの85%を超えた場合にPageのLODを調整する 例:PagePoolSizeを4096->100に制限(メモリは512MBから16MBへ削減)
その他機能に関する情報 ・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
Tips
Shader Print UE5の一部のデバッグ表示はShaderPrintで描画 (Compute Shaderで各種リソースを表示用データに変換) r.Nanite.ShowStats r.Shadow.Virtual.ShowStats etc. 一部の表示は調整可能 r.ShaderPrint.FontSize r.ShaderPrint.FontSpacingX r.ShaderPrint.FontSpacingY
Shader Print - 比較的分かりやすい実装 CPP側、CS Shaderにそれぞれ実装が必要 RadianceCacheUpdateStatsがシンプル r.Lumen.ScreenProbeGather.RadianceCache.Stats LumenRadianceCacheDebug.usf その他エンジン実装を確認したい場合は、 ../ShaderPrint.ush で検索すると使用実装が確認可能
Shader Print - CPP側
r.ShaderPrint.Zoom Viewport上でマウスカーソル上を拡大表示する r.ShaderPrint 1 で機能を有効にした後、 r.ShaderPrint.Zoom 1 を設定 ・表示場所を変更 r.ShaderPrint.Zoom.Corner ・ズーム対象のピクセル数 r.ShaderPrint.Zoom.Pixel ・ズームする倍率 r.ShaderPrint.Zoom.Factor
テクスチャの視覚化 - VisualizeTexture/Vis RDGリソースに対応し、リアルタイムで可視化可能(Development builds上) Vis コマンドのみ実行するとHelpとリソース名一覧が表示される VisualizeTexture/Vis <RDGResourceName>[@<Version>] [<Mode>] ~
Vis - Pool Vis Pool : リソース一覧のみ表示 Vis Pool BYNAME : 名前でソート表示 Vis Pool BYSIZE : サイズでソート表示
Vis - BMP ・BMPコマンドで元サイズで画像出力可能 Vis [リソース名] BMP ・右図の例 vis Lumen.SceneAlbedo BMP
Render Resource View サイズ等でソートすると大きいリソースを手軽に早期に発見できるので非常に有用
シェーダ開発Tips - COTFの利用 グローバルシェーダを変更する場合、多くCompileが走ってしまい時間がかかる Cook on the fly(COTF)対応のプラットフォーム上の場合、 パッケージを用意しておけば、変更のあるシェーダのみコンパイルされ適用可能
COTFの利用 - 手順 起動後すぐに確認できるようなシンプルなプロジェクトを用意し、 COTFモードで起動することでイテレーションを速く開発することが可能 手順: 1. ホスト側:クッカーサーバーを起動 ./UnrealEditor-Cmd.exe "xxx.uproject" -run=cook -cookonthefly -targetplatform=Windows 2. ゲーム側:クッカーサーバーのアドレスを指定してパッケージを起動 (アドレスはクッカー起動ログに表示) ./GAME.exe -filehostip=x.x.x.x -windowed ※-windowed(ウィンドウ起動)は必要に応じて
BasePassPixelShader.usfを変更した例 .usf変更後、RestartLevelコマンドで適用可能
グラフィックスデバッグ DumpGPU コマンド RenderDoc etc.
DumpGPUコマンド コマンドdumpgpuを実行することでウェブブラウザで確認できるGPU Dumpを出力 ※エディタ上の場合でもPIE実行後可能
RenderDoc 直近のバージョンだとRenderDocのプラグインの有効化に加えて、 起動引数に -AttachRenderDoc が必要 シェーダのデバッグを行いたい場合、 /Engine/Config/ConsoleVariables.iniの以下コマンドをコメントアウトを取り除く r.ShaderDevelopmentMode=1 r.Shaders.Optimize=0 r.Shaders.Symbols=1 ステップ実行などのデバッグはD3D11のみ対応しているため 追加で -dx11 引数が必要 追記: D3D12の場合、プロジェクト設定からSM5で動作するように切り替えることで デバッグ実行可能との情報を頂きました(SM6のDXIL対応が原因のため)
RenderDoc - Shader Debug D3D11で見れる範囲であればRenderDocがお手軽
レンダリングシステム周りの機能 まとめ Nanite、Lumen、VSM等について その他開発Tips