🐡
PIXのAPIを使ってPIXを見やすくして調査しやすい環境を作ろう
概要
-
PIXとは、簡単に言うとDirectX12に渡しているコマンドの一覧が見れるツールがあります。
-
このツールはとても便利ですが、C++側で
PIX
のAPIを呼ばない状態だと、同じ描画コマンド(DrawIndexed
やDispatch
)だと、ただの板ポリ描画でもUI描画なのか、ポストエフェクト描画なのかは一目では判断が付かない状態になっています。 -
添付した画像はmicrosoft/DirectX-Graphics-Samplesの「D3D12FullScreen」プロジェクトを何も
PIX
のAPIを呼ばない状態のものです。コマンドリストの数が少ないからまだ見やすいですが、コマンドが増え続けるとどこからがどの描画なのかがわかりにくくなります。
-
そこで、ここからここまでは不透明描画グループ、ここからここまではポストエフェクトのグループなど、まとまった単位で見やすくなる機能が
PIX
のAPI側で備えられており、それを使ったほうが調査もしやすくなります -
添付した画像のように、PIXのAPIを使うことでフォルダみたくグループかしたり、文字の色を変えたりなどができるようになり、調査しやすい環境を自分で作るようになります。
この記事で達成したいこと
- たくさんの描画コマンドを特定のグループで分けるようにして見やすくする。
- 文字に色をつけて重要な所は◯◯色にするなど、ルールを決めて見やすくする。
基本的な流れ
- 描画コマンドをまとめたい場所に
PIXBeginEvent
を呼び出したあとに登録したい描画コマンドを呼び出し、PIXEndEvent
を呼んでグループ化させる。 - 色情報を付ける場合は上記の
PIXBeginEvent
の引数にPIX_COLOR
を入れる。
PIX_COLOR
UINT PIX_COLOR(
BYTE r,
BYTE g,
BYTE b d
)
- PIXBeginEventやPIXScopedEventで色を変えたいときに使う。
- BYTEには0~255の値を入れる。
- 例として赤を入れる場合は以下のコードになる。
- 色情報は不変なので、constであらかじめ定義しておいた方が使い勝手は良さそうな気がしてます。
サンプルコード
const UINT red = PIX_COLOR(255,0,0);
PIXBeginEvent
void PIXBeginEvent(
void* context,
UINT64 color,
PCWSTR formatString,
...
)
-
context
にはID3D12CommandQueue
やID3D12CommandList
を入れる。 -
color
には先述したPIX_COLORなどで返ってきたUINTの値を使う。
サンプルコード
UINT red = PIX_COLOR(255,0,0);
PIXBeginEvent(m_commandQueue.Get(), red, L"Render");
PIXEndEvent
void PIXEndEvent(
)
-
PIXBeginEvent
とセットで使うもの。 - これを呼び出した段階で直前に呼び出した
PIXBeginEvent
までをグループ化をしてカテゴリ分けしてくれる
サンプルコード
PIXBeginEvent(m_commandQueue.Get(), red, L"Render");
//グループ化したいコマンドを随時呼び出す(DrawInstancedなど)
PIXEndEvent(m_commandQueue.Get());
参考資料
Discussion