シェーダーのデバッグはなかなか大変です。色情報を出力して目視確認というのは基本ですが、ソースコードレベルでステップ実行したいこともあります。 今回 RenderDoc で Vulkan 向けのシェーダーをデバッグできそうだったので紹介します。
シェーダーをデバッグビルドする
glsl から SPIR-V の形式へコンパイルするときに、デバッグ情報付きにします。また最適化も切っておくと、調査がしやすいでしょう。このシェーダーコンパイルでは、以下のようにコンパイルオプションを追加します。
glslangValidator -S vert -V -g -Od -o shader.spv shader.vert
- “-g” デバッグ情報を追加
- “-Od” 最適化を抑制
ここでは 頂点シェーダーの例ですが、同様にフラグメントシェーダーにも適用可能です。
RenderDoc でデバッグ
RenderDoc の Mesh Viewer から頂点を選択してデバッグ、もしくは Texture Viewer からピクセルを選んでデバッグ、でシェーダーのデバッグができます。
シェーダーにデバッグ情報が付いていれば、上記のように Disassembly のほかにソースコードを確認することができるようになっています。そして、ステップ実行や各種変数の値を下段の各ウィンドウにて確認ができます。
※これらの値の内容はエミュレーションで再現されているようなので、GPU上のシェーダーのデバッグを実行しているわけではありません。とはいえ、この状態でもかなり手助けになることは多いのではと思います。
より詳しい使い方の説明は、本家ドキュメントを参照して下さい。
なお、シェーダーアセンブリ(SPIR-V)レベルをデバッグすることは、いつでも可能なようです。
まとめ
DirectX であれば、PIXを使ってシェーダーのソースコードレベルデバッグが可能です。Vulkan ではこのツールが使えません。今のところベンダー中立で使える RenderDoc がシェーダーデバッグの機能があるので、活用していきたいところですね。
コメント