描画用キューブマップを各面毎にクリアしたときに警告を出してしまったので、これらについて対処するための小ネタです。
レンダーターゲットを動的なカラーでクリアすると警告
レンダーターゲットを任意のカラーでクリアするとワーニングが発生します。レンダーターゲット生成時に指定したカラー値(デプス値)と違ったものでクリア処理を呼ぶと、パフォーマンスの観点から怒られるようです。予想ですが、高速クリア処理というような処理が使えなくなるからでしょう、たぶん。
D3D12 WARNING: ID3D12CommandList::ClearRenderTargetView: The application did not pass any clear value to resource creation. The clear operation is typically slower as a result; but will still clear to the desired value. [ EXECUTION WARNING #820: CLEARRENDERTARGETVIEW_MISMATCHINGCLEARVALUE]
しかしながら開発時やデバッグの時などでは、個別のクリア値でターゲットをクリアしたいことがあります。このときに警告が毎フレーム通知されると、本当に必要な警告が見落としてしまうので、既知のワーニングをフィルタリングしておきたいと思います。
これには ID3D12InfoQueue インタフェースを使用して設定を行います。次のように、レンダーターゲットのカラークリアに関する警告メッセージIDを設定して、 PushStorageFilter メソッドを呼び出します。
ComPtr<ID3D12InfoQueue> infoQueue;
m_device.As(&infoQueue);
D3D12_MESSAGE_ID denyIds[] = {
D3D12_MESSAGE_ID_CLEARRENDERTARGETVIEW_MISMATCHINGCLEARVALUE,
};
D3D12_MESSAGE_SEVERITY severities[] = {
D3D12_MESSAGE_SEVERITY_INFO
};
D3D12_INFO_QUEUE_FILTER filter{};
filter.DenyList.NumIDs = _countof(denyIds);
filter.DenyList.pIDList = denyIds;
filter.DenyList.NumSeverities = _countof(severities);
filter.DenyList.pSeverityList = severities;
infoQueue->PushStorageFilter(&filter);
エラー発生でブレーク
ID3D12InfoQueue には他にもデバッグ時に役立つ便利な機能があります。 個人的には、 SetBreakOnSeverity で、エラーが発生したときにブレークする設定をよく使います。
デバッグレイヤーを使用していると、出力ウィンドウにエラーの情報が出てくることは分かっていますが、そのまま実行が継続され、ある程度後の方になってプログラムが停止するという状況がよくあります。この設定をしておくと D3D12 ERROR が発生したときに、デバッガで停止させることが出来て、少し調査が楽になります。
infoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_ERROR, TRUE);
まとめ
今回の内容はキューブマップにレンダリングする際に色々とデバッグしていて、これらの設定にお世話になりました。