巷で難しい!わからない!と言われているDirectX12に挑戦しようと思って始めてみました。
さすがにサンプルと公式リファレンスだけでは厳しかったので、タイトルの通り『DirectX12の魔導書』を参考に色々いじっています。
DirectX 12の魔導書 3Dレンダリングの基礎からMMDモデルを踊らせるまで
この本を読みながら進めててちょくちょく詰まったところを、メモ代わりにちまちま書き残していきます。
現在の進捗
- 初期化から画面クリアまで
- ポリゴンの表示
- テクスチャを貼り付ける←いまここ
- 行列による座標変換
- PMDの読み込みとモデル表示
- マテリアル
- スキニングとアニメーション
- インバースキネマティクス(IK)
- マルチパスレンダリング
- 影行列とシャドウマップ
- マルチレンダーターゲットとその応用
- スクリーンスペースアンビエントオクルージョン(SSAO)
ポリゴンの表示
EXECUTION ERROR #613: RENDER_TARGET_FORMAT_MISMATCH_PIPELINE_STATE
エラー表示
D3D12 ERROR: ID3D12CommandList::DrawInstanced: The render target format in slot 0 does not match that specified by the current pipeline state. (pipeline state = B8G8R8A8_UNORM, RTV ID3D12Resource* = 0x00000206B90E28D0:'Unnamed ID3D12Resource Object') [ EXECUTION ERROR #613: RENDER_TARGET_FORMAT_MISMATCH_PIPELINE_STATE]
D3D12 ERROR: ID3D12CommandList::DrawInstanced: The render target format in slot 0 does not match that specified by the current pipeline state. (pipeline state = B8G8R8A8_UNORM, RTV ID3D12Resource* = 0x00000206B90E28D0:'Unnamed ID3D12Resource Object') [ EXECUTION ERROR #613: RENDER_TARGET_FORMAT_MISMATCH_PIPELINE_STATE]
レンダーターゲットのフォーマットとパイプラインのフォーマットが合ってないぞ、と怒られてます。
解決
//---- スワップチェーンの初期化
DXGI_SWAP_CHAIN_DESC1 swapchainDesc = {};
swapchainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
//---- パイプラインの初期化
D3D12_GRAPHICS_PIPELINE_STATE_DESC gpipeline = {};
gpipeline.RTVFormats[ 0 ] = DXGI_FORMAT_R8G8B8A8_UNORM;
確認していたらフォーマット違ってました。
DXGI_FORMAT_B8G8R8A8_UNORM
とDXGI_FORMAT_R8G8B8A8_UNORM
でよく見るとRGBの順番が違います。
よく見て設定しないとだめですね。
エラー出てない、なのに三角形が出てこない
長い長いパイプラインの設定が終わって、コマンドも描いてさあ描画と思ったけれど三角形が出てこない。
座標も合っているし、設定値も間違ってない。どういうことと迷いました。
解決
_cmdList->SetPipelineState( _pipelinestate );
_cmdList->SetGraphicsRootSignature( _rootsignature );
//_cmdList->RSSetViewports( 1, &viewport ); ←これと
//_cmdList->RSSetScissorRects( 1, &scissorrect ); ←これを忘れてる
_cmdList->IASetPrimitiveTopology( D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
_cmdList->IASetVertexBuffers( 0, 1, &vbView );
_cmdList->DrawInstanced( 3, 1, 0, 0 );
描画命令(p144)で、コマンドリストに積み重ねるコマンドが一覧で載っています。
- パイプラインステートのセット
- ルートシグネチャのセット
- ビューポートとシザー矩形のセット
- プリミティブトポロジのセット
- 頂点情報のセット
- 描画(Draw)命令
このあと、それぞれの実際のコードが書いてあるのですが、3. ビューポートとシザー矩形のセットに関しては書いてません。(前節のコラムp144で小さく書かれています)
これを書くのを忘れてたから描画されてませんでした。
ポリゴンにテクスチャを貼り付ける
エラーが出ないのにテクスチャが表示されない
ノイズのテクスチャを貼り付けたはずなのに、四角形が真っ黒になるという事象が発生しました。
解決
シェーダーリソースビューの設定値が間違えてました。
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
//srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UINT; // ← NG
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // ← OK
だいたいうまく表示されないのは設定値ミスが多いですね。