1 / 4 Frame Debugger
Frame Debuggerで描画順を観察し、一枚の完成画面が複数の描画イベントから作られることへの理解を深めます。
一枚の画面は一度に完成しない
3DCGの画面は、一度に完成するわけではありません。
影のための深度を作る処理、物体の色を描く処理、完成した画面の色を調整する処理などを組み合わせて構成されます。
このSceneでは、影・不透明物・背景のコピー・透明なウサギ・Post Processを順に探します。
Frame Debugger とは
Frame Debuggerは、Unityの描画パイプラインにおける各描画イベントを順に追い、画面がどのように作られていくかを観察するためのツールです。
3Dモデルがどの順序で描かれたか、どのMaterialやPassを使ったかを確認できます。
これにより、描画順序や使用されるMaterial、Pass、Render Targetなどを確認できます。
Frame Debuggerの使い方
Frame Debuggerを使うには、まずWindow > Analysis > Frame Debuggerからウィンドウを開きます。Enableボタンを押すと、現在のフレームの描画イベントが一覧表示されます。
イベントを選択すると、その時点までの画面の状態がGameビューに反映されます。
イベントを一つずつ進め、あるいは戻しながら、描画の順序や中間の結果を確認します。
Draw Eventとは
描画は、複数の段階に分かれて行われます。
これらの各工程を描画イベントと呼びます。
Frame Debugger上には、描画イベントが発行順に一覧表示されます。
イベントにはMeshを描くDraw Callのほか、Render Targetのクリア、Textureのコピー、画面効果なども含まれます。
イベントは描画の各段階を表しており、必ずしも一つの物体を描くための命令の単位ではありません。
イベントを一つ進めたとき、画面のどこに何が加わったかを観察し、その役割を推測することで、描画の工程を紐解いていきましょう。
Shadow Mapは、Lightから見た表面のDepthを保存し、光が遮られた場所を判定するためのTextureです。Post Processは、Sceneを描いた後の画面全体へ色調整やBlurなどを適用する処理です。
同じ物体が複数回現れる理由
Frame Debuggerで描画の様子を確認していると、同じ物体が何度も描画されて見える場合があります。
不自然に思えるかもしれませんが、これは必ずしも無駄な描画というわけではありません。
画面に一回だけ見える物体でも、Shadow用の深度を作るときと、本体の色を描くときに別々のPassで描かれることがあります。
これらは描画の仕組み上、必要な描画です。
つまり、「一つのGameObjectは一回だけ描画される」とは限りません。
処理時間を測る道具ではない
Frame Debuggerを見ても、そのShaderが描画完了までにどれだけの時間を使ったかは分かりません。
Frame Debuggerは、描画順や使用した資源を調べるツールです。
最適化に役に立つこともありますが、処理時間を直接計測するものではないことに注意してください。
変化の前後を比べる
イベントを選んだら、選択前と選択後の画面を比べます。
最初にDepthだけが書かれる場合、完成色には見えなくても後の可視性へ影響しています。
Render Targetは、描画結果を書き込む先となるTextureやBufferです。
見た目の変化だけでなく、そのイベントがColor、Depth、Shadow用Textureのどこへ書いたかと、使用したPassを確認します。
実習:画面が作られる順序を記録する
13_RenderPipelineSceneを開き、Gameビューで赤いCapsule、緑のCube、青いSphereと、手前のStanford Bunnyを確認します。Playせずに進められます。- 設定を変える前に、影・不透明物・透明なウサギ・Post Processの順序を予想します。ウサギが使う背景のTextureを、どこで用意するかも考えてください。
Window > Analysis > Frame Debuggerを開き、接続先がEditorであることを確認してEnableを押します。Main Cameraに対応するまとまりを開き、最後のイベントで完成画面に近い状態を確認します。- 先頭へ戻り、イベント一覧のまとまりを開いて、一つずつ選びます。色の画面だけでなく、選択中のRender Targetも確認します。
- Stanford Bunnyが現れる直前と直後を比較します。Cube、Sphere、床がウサギより前に描かれ、その色がウサギの描画に使われていることを確かめます。
- Capsuleが影用の描画と本体の描画に現れる例を探します。
| 探す処理 | 手掛かり | 見る内容 |
|---|---|---|
| Directional Lightの影 | Main Light、Shadow、ShadowCaster | 視点Cameraの色ではなく、Lightから見た深度 |
| 深度・法線と接触陰影 | Depth、Normals、SSAO | 物体の距離や向き、隙間の暗さを作る材料 |
| 不透明物 | Opaque、Red、Green、Blue、Grid | Capsule・Cube・Sphere・床の本体色 |
| 背景の保存 | Copy Color、Opaque Textureなど | 透明物を描く前の画面をTextureへコピーする処理 |
| 透明なウサギ | Transparent、Refraction | 保存した背景色を使って屈折を描く処理 |
| 画面効果 | Post、Bloom、Uber、Finalなど | 明るい部分のにじみ、輪郭の色ずれ、色調整、最終出力 |
表の名前は探す手掛かりです。Unityの設定によってまとまり方や表示名は変わるため、番号は固定しません。使用Shader、Pass、出力先を合わせて確認してください。
設定を変更するときは、Frame DebuggerをDisableで通常描画へ戻します。Inspectorで一つだけ変更し、その後もう一度Enableにして比べてください。
観察結果から読み取る
予想と実際の順序が違っていても問題ありません。このウサギは、先に描いた不透明物の色をTextureから読み取り、読む位置をずらして背景の屈折を表しています。そのため、不透明物の描画と背景のコピーがウサギより前に必要です。SSAOでも、先に準備した深度や法線を後の処理に使います。
Skyboxを描くイベントでは、物体の後ろに空の背景が加わります。ウサギの表示を切り替えると、背景のコピーと、それを使う透明物の描画を区別しやすくなります。
イベントの順序は、使用するRender Pipelineや設定によって変わります。特定の番号を覚えるのではなく、「この処理は何を入力し、何を画面へ追加したか」を説明できる状態を目指します。
- Draw Eventを自分の言葉で説明できる
- OpaqueとTransparentが描かれる位置を見つけた
- 同じ物体が複数のPassで描かれる例を見つけた
- Frame DebuggerとProfilerの目的を区別できる
- 描画順の予想と観察結果の違いを説明できる