Unity
graphics
Rendering
UnrealEngine
RenderDoc

グラフィックスパフォーマンスプロファイリング超初級 RenderDoc編

テクニカルアーティストがモバイル業界もコンソール業界も人手不足と聞いて、じゃあ俺がなってやんよ!と 株式会社よむネコ にてテクニカルアーティスト見習いをはじめました。

今回は、レンダリング周り興味あるけど全然分からないって方向けにグラフィックスデバッガの RenderDoc の簡単な使い方をお届けします。誤った内容等ございましたらコメントにてご指摘頂けると幸いです。

対象読者はレンダリング初心者を想定しています。

検証は UnrealEngine4 のフォワードシェーディングで行っております。

キャプチャ方法

RenderDoc を利用するにはプラグインとログビューワーをインストールする必要があります。
UE4.16 からプラグインは標準でインストールされていますが、ビューワーのインストールは別途必要です。

RenderDoc プラグインを有効化するとレベルビューの右上にキャプチャボタンが表示されます。
ゲームを再生しなくてもキャプチャボタンを押下することでキャプチャすることが出来ます。また、コンソールコマンド renderdoc.CaptureFrame[Alt + F12] でもキャプチャできます。
level_view.png

キャプチャ後、RenderDoc が起動するので、localhost - UE4Editor タブのスクリーンショットを選択し、キャプチャデータをロードします。
ロード後、Event Browser のストップウォッチボタンを押すと処理時間を取得できます。
renderdoc_load_log.png

Event Browser

Event BrowserFrame/Scene がこのシーンのレンダリングに要した総処理時間です。Frame/Scene 内の重要なパスを次に紹介します。

PrePass

BasePass に先んじて DepthBuffer を生成する。
ここで生成した DepthBufferShadowProjection や、DBufferDecalBasePass
で利用される。
Opaque タイプで条件に適応する1マテリアルはピクセルシェーダーを無効化(null pixel shader)にすることが出来て高速に広い領域を塗りつぶす事ができます。
Masked タイプのマテリアル や LOD Dither transition 設定を使った場合軽量なピクセルシェーダーが起動します。中身はライティング計算等が省かれているので軽量です。
ここが重い場合は頂点数が多いか、ドローコール数が多いかのどちらかなので、適切にカリングしたり、メッシュをまとめたり2、LOD3を適切に利用すると良いらしい

ShadowDepth

シャドウマップを作ります。
負荷特性は PrePass とだいたい同じです。
CascadedShadow を使う場合は大きなサーフェスに Movable Mesh を全部突っ込みます。
PerObjectShadow を用いる場合はメッシュ毎に小さな領域を割り当ててレンダリングしていきます。

ShadowProjection

ShadowDepth パスで生成したシャドウマップと PrePass で生成した DepthBuffer を参照して、スクリーンスペースに影になる領域を描画します。
CascadedShadow を用いた場合はカスケードの段数分ドローコールが走ります。
PerObjectShadow の場合そのメッシュの数だけドローコールが積まれるので、
ドローコール数が多くて厳しい場合は CascadedShadow にすることで GPURenderingThread の負荷を軽減できるかもしれません。

BasePass

実際に画面に色を塗る。
大雑把に言うと、頂点負荷 + ピクセルシェーダー負荷で、(BasePass - PrePass) がピクセルシェーダー負荷。
負荷は基本的に塗る面積に比例するので、同等の面積のオブジェクトと比べて重い場合は次のような対策で軽減できるかもしれない。

  • テクスチャフォーマットの見直し4
  • テクスチャサイズの最適化5
  • ピクセルシェーダーの最適化6

Translucency

半透明によるオーバードロー負荷。
半透明☓ライティングはちょう重い。だいたいパーティクルが犯人なので、重いものはアーティストに直してもらう。

PostProcessing

ポストプロセスボリュームの設定より固定負荷。

Mesh Output

メッシュ情報を参照できます。
Preview タブの VS Input, VS Output で、頂点シェーダーへの入力/出力のプレビューを見ることが出来ます。
基本的には入力と出力に同形状のものが表示されると思いますが、ShadowDepth では、入力されたメッシュの形状と、出力された影の形状が確認できます。
vs_output.PNG

vs_output_.PNG

Texture Viewer

Overlay 設定で Highlight DrawcallWireframe Mesh を選択することで、各ドローコールで描かれている順序、場所、面積がわかります。
texture_viewer_1.png
↓↓↓
texture_viewer_2.png

Inputs タブで参照しているテクスチャを見ること出来ます。
texture_viewer_3.png

Overlay 設定で Quad Overdraw でオーバードローしているピクセルを表示できます。
quad_overdraw.png

さいごに

よむネコでは、世界を変えるVRコンテンツを共に作る仲間を募集しています。


  1. DepthBufferの情報と比較し最前面でないマテリアル 

  2. まとめ過ぎた大きなメッシュは、カメラに入らない部分も頂点計算される 

  3. ピクセルより小さいポリゴンは無駄 

  4. 圧縮テクスチャを利用することでテクスチャの読込を高速化できる 

  5. 必要以上に大きいテクスチャは、キャッシュ効率が悪い 

  6. [Pipeline State > Pixel Shader (PS)] タブの View ボタンを押すことで中間コンパイルされたシェーダーコードを表示できる。基本的に長いほど重い。