【DirectX12】「D3D12 ERROR: ID3D12CommandList::DrawIndexedInstanced: The render target format in slot 0 does not match that specified by the current pipeline state.」というエラーの対応

【DirectX12】「D3D12 ERROR: ID3D12CommandList::DrawIndexedInstanced: The render target format in slot 0 does not match that specified by the current pipeline state.」というエラーの対応

DirectX12の初期化処理を書いて矩形の表示までしたところで実行してみると、正常に表示はされているもののタイトルにも記載している

D3D12 ERROR: ID3D12CommandList::DrawIndexedInstanced: The render target format in slot 0 does not match that specified by the current pipeline state.

というエラーが毎フレーム出力されていました。正常に表示されているもののエラーが出ているということはどこかで間違えていることになりますので対応します。

原因

パイプラインステートオブジェクトに設定したRTVフォーマットがレンダーターゲットのフォーマットと一致していないことが原因でした。

対応

ログを確認してみると下記のような記載がありました。

pipeline state = R8G8B8A8_UNORM, render target format = B8G8R8A8_UNORM

パイプラインステートオブジェクトはR8G8B8A8なのにレンダーターゲット側はB8G8R8A8となっています。微妙な違いですがこれのせいでエラーがずっと出続けていたようです。手元でスワップチェーンのフォーマットを修正したところ発生しなくなりました。DirextX12はこのように小さなことでも「動いてはいるけど、エラーは出ている」みたいなことが往々にして発生するのでしっかりとログを確認しながら実装していくほかありません。

そのうちR8G8B8A8_UNORMB8G8R8A8_UNORMの違いなんかを記事にしてもいいかもしれませんね。