本日はRenderDocを触ります。
〇RenderDocとは?
RenderDocはMITライセンスで開発、提供されているスタンドアローンなグラフィックスデバッガーです。
通常レンダリング回りの処理はGPU上で動いているためログの出力などが難しく、デバッグやプロファイルが困難です。
RenderDocを使用するとグラフィックスパイプライン上での処理に関して一つ一つイベントを見ることができます。
先日はUintyでのRenderDocの導入を見ました。
今回は実際にRenderDocを使用してデバッグを見ていきます。
〇Unityシーンのデバッグ
①UnityのシーンもしくはGameウィンドウからカメラアイコンを選択しRenderDocを起動します。

②RenderDocが開き、Capture Collectedにデバッグを行うキャプチャが表示されます。

③キャプチャをダブルクリックするとイベントが表示されます。

④Evebnt Browserではレンダリングの処理の流れがイベントという形で並びます。
ここでEID(EventID)の順番に処理が行われていることを示しています。

⑤Controlesから、時計のアイコンを選択すると処理にかかった時間がマイクロ秒で表示されます。

ここではこのスクリーンショットを描画するためには10285.056マイクロ秒かかったということになります。
これは秒に直すと 0.01秒になります。
この0.01秒の間の処理を見ることができるのがRenderDocです。
⑥チェックしたいイベントを選択しTexture Viewerを開くことで、そのイベントでの描画状況が確認できます。

⑦デバッグを行いたいイベントを選択します。
今回はMRTGのMaterialgalleryからEmissionMapの描画を見ていきます。


Texture Viewerから確認すると、そのイベントでの描画としてEmissionMapが確認できます。

⑧Mesh Viewerからはそのイベントで使用されているメッシュと、そのメッシュが持つ頂点、法線、テクスチャ座標が一覧で取得できます。

GUIからメッシュを右クリックで選択するとそのメッシュを構成する頂点が見ることができます。

⑨次にPipeline Stateタブを選択します。
RenderDocでシェーダーのデバッグを行う際に一番重要なタブです。
ここではレンダリングパイプラインでのデータの流れを見ることができます。

Input Assemblerはメッシュからの入力情報です。
これはShaderで例えると頂点シェーダーで使用する情報を定義するAppdata構造体などで定義されるデータです。

次にVertex Shaderは名前のままに頂点シェーダーです。
今回の場合特に特別な処理をしていないので何も表示されていませんでした。

Hull Shader、Domain Shader、Geometry Shaderはいずれも使用していないため非表示になっています。
ここで注目が描画に使用されているShader名がきちんと表示されています。

次にPixel Shaderでピクセルシェーダーで使用されているリソースを確認できます。
今回はここで使用されているemissionTextureが表示されます。

最後にOutput Margerです。

ここでは描画した絵をすでにかいていた絵に合成したりしますが、ここでBlendingやステンシルの現状を確認することができます。

今回はパイプラインでの処理の流れを追ってみました。
実際にデバッグする際は今回の情報と、その処理に何秒時間をかけているのかでベンチマークをとることができそうです。