https://renderdoc.org
Latest Stable Build(.zip) を選ぶ
それは初回起動時の匿名データ収集の確認画面 一番下を選べばOK
「Do not gather or submit any statistics.」
起動する
Executable Pathに UEのパスを入れる
D:\Program Files\Epic Games\UE_5.7\Engine\Binaries\Win64\UnrealEditor.exe
Command Line ArgumentsにUEプロジェクトのパスを入れる
D:\Sandbox\UE573petit25Cl\UE574petit25Cl_Lighting\UE574petit25Cl.uproject
Lunchで起動すると
RenderDoc経由でUEが起動する
UE開いたら
UEにフォーカス当てて👉 F12押す
出てきたキャプチャをダブルクリックすると
Filterを使って描画やCompute処理だけに絞って確認しています。 DrawCallはDrawIndexed DrawInstanced Dispatch Clearなので Dispatch をFillterしてみると見えた。
Filterはこう使う👇
■ ■ 重い描画だけ見たい
Draw
■ ■ Computeだけ
Dispatch
■ ■ 特定のPass
BasePass
どのDrawCallを見るべきか?
見る順番はこれでOK。
1. まず「大きいPass名」を見る
UEならこのあたりを探す。
ShadowDepths 影が重いか見る。
BasePass メッシュ本体の描画。マテリアルやテクスチャ参照を見る。
Lighting / DeferredLighting ライト計算を見る。
Translucency 半透明。重くなりやすい。
PostProcess Bloom、Tonemap、DOF、独自ポストを見る。
2. 次に、その中のDrawを見る
Passを開いて、こういう行をクリックする。
DrawIndexedDrawInstancedDispatch
クリックしたら右側で見る場所は3つ。
Texture Viewer → 何が描かれているか見る。
Pipeline State → どのShader、Texture、Blend設定か見る。
Mesh Viewer → どのメッシュを描いているか見る。
まずShadow、BasePass、Translucency、PostProcessなどの大きいPass単位で見て、次にDrawIndexedやDispatchを選んで、RenderTarget・Shader・Texture参照を確認します。
最初に見るおすすめ
迷ったらまずこれ。
BasePassのDrawIndexed や PostProcessのDraw/Dispatch だが → マテリアル、テクスチャ、メッシュが確認しやすい。 BassPassが出たらクリックしてフラッグを立てるそして、Filterを解除
フラッグが立っている場所までスクロールすると中が見える状態
ExecutecommandListに入ってるのが見えないので。設定を変えてキャプチャし直し。
DX12ではExecuteCommandListsとしてまとまって見える場合があるので、RenderDocではCapture all Cmd Listsを有効にするか、確認用にDX11で起動してDrawIndexed単位で確認します。
■ やり直す設定
RenderDocの Launch Application 画面でチェックする:
✅ Capture all Cmd Lists
✅ Ref all Resources も付けてOK
DX11でやる
Command Lineにこれ入力👇
"D:\Sandbox\UE573petit25Cl\UE574petit25Cl_Lighting\UE574petit25Cl.uproject" -d3d11 -NoRHIThread
DX12ではDrawCallがコマンドリストにまとまるため、Pass単位で処理を確認しつつ、必要に応じてDX11でDrawIndexed単位でも確認しています。
見つかった!
DrawIndexedInstanced(6, 17)
意味:
Index数:6(1ポリの簡単な形)
Instance数:17(同じものを17個描画)
👉 パーティクル or 草(インスタンシング)
DrawIndexedInstancedを見て、インスタンシングで同じメッシュを複数描画していることを確認できます。
1回のDrawCallで複数インスタンスを描画しているため、DrawCall削減による最適化がされています。
次見るべきポイント PSSetShader (Pixel Shader)
重そうか(分岐 / テクスチャ数) マテリアル名
PSSetShaderResources テクスチャ数(ここ重要)
見る
目安
1〜3枚 → 軽い
4〜6枚 → 普通
7枚以上 → 重い可能性
このDrawはまだ画面を全部埋めてない
■ ここでやるべき操作(超重要)
■ ① Eventを少しずつ進める
👉 左のEvent Browserで
■ ② 右のTexture Viewerを見る
👉 変化を見る
変わった
■ 今起きてること
👉 Eventを進めたことで
👉 つまり
このDrawが実際に画面に何かを描いてる
■ 今のDrawの正体
左を見ると👇 DrawIndexedInstanced(6, 16)
👉 意味
👉 つまり
パーティクル or インスタンス草
■ ① このDrawで何が変わった?
👉 右画面で見る
👉 これ言える
「このDrawでパーティクルが追加されているのが確認できます」
イベントを進めることで、最初は未描画だった画面が、各Drawによって徐々に埋まっていく様子を確認できます。
チェッカーが消えるタイミングを見ることで、どの描画処理が最終的な画面に影響しているかを特定できます。
RenderDocではイベントを進めながら、どのDrawで画面に要素が追加されるかを確認しています。今回のケースでは、インスタンシングされたパーティクルが描画されているのが確認できます。
このようにDrawごとの変化を見ることで、描画順や負荷のかかる処理を特定しています。
■ ここまでできてること
DrawCall見つけた
実際の変化を追えてる
インスタンシング理解してる
■ どういう意味?
RenderDocの流れ👇
最初 👉 何も描いてない(黒 / チェッカー)
途中 👉 一部だけ描画(点・葉っぱ)
今 👉 全体が描画で埋まった ← 今ここ
👉 つまり
この辺のDrawで最終結果に近づいた
イベントを進めることで、最初は未描画だった画面が、各Drawによって徐々に埋まっていく様子を確認できます。
チェッカーが消えるタイミングを見ることで、どの描画処理が最終的な画面に影響しているかを特定できます。
状態は「まだ画面を全部塗るDrawに来てない」 ってこと。 (チェッカーが残ってる=未描画領域がある)
■ 今の位置の意味
左を見ると👇
BasePass
DrawIndexedInstanced(6, 17)(葉っぱ)
👉 これは
“オブジェクト描画フェーズ”
👉 だから
一部だけ描かれる
画面全部は埋まらない
チェッカー残る
■ 次に探すべきもの(重要)
👉 画面を一気に埋めるDraw
■ 目印
これ探す👇
PostProcess
Tonemap
Fullscreen
Resolve
Composite
■ 何が起きてるか(技術的に)
👉 今のDrawで
SceneColorに
あなたのHLSLで描いた月が加算された
👉 つまり
Pixel Shaderが最終色を決めている瞬間
このDrawでは、独自のHLSLシェーダを使って月の表現を描画していて、SceneColorに対してピクセル単位で最終色を出力しています。
RenderDocでこのDrawを確認することで、実際にどのシェーダが最終結果に影響しているかを特定できます。
このようにDrawごとの出力を追うことで、意図したシェーダが正しく画面に反映されているかを検証できます。
■ ここで見るべきポイント(重要)
■ ① Pixel Shader
👉 ここ
PSSetShader
HLSLが動いてる場所
■ ② Shader Resource(テクスチャ)
👉 月の模様
Shader Resource View
■ ③ DrawIndexedInstanced
👉 描画回数
■ さらに強い視点
フルスクリーンじゃない → オブジェクト描画
一部だけ変わる → メッシュ単位
ピクセルで模様 → Pixel Shader
RenderDocを使うことで、実際の描画結果とシェーダの対応関係を確認しています。
■ 結論(今回のケース)
👉 重くなりやすい要因はこれ
① パーティクル(葉っぱ)のインスタンス描画
DrawIndexedInstanced(6, 16/17)
数が増えると一気に負荷増える
② Pixel Shader負荷
独自HLSL(月の模様)
ピクセル単位で計算してる
③ テクスチャ参照
PSSetShaderResources
複数テクスチャ使ってる
④ オーバードロー(これが一番重要)
👉 葉っぱ(半透明)が重なる 👉 同じピクセル何回も計算される
■ 一言でまとめると
パーティクルのオーバードロー+ピクセルシェーダ負荷
今回のケースでは、パーティクルのインスタンス描画によるオーバードローと、ピクセルシェーダの計算量が主な負荷要因だと考えています。
特に半透明オブジェクトは重なりやすく、ピクセル処理が増えるため注意が必要です。
■ もう一段上
👉 改善案も言う
インスタンス数制御
テクスチャ削減
シェーダ簡略化
LODや距離カリング
■ まとめ
👉 今回の分析
Draw見た
Shader見た
結果から原因言えた