4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

『DirectX12の魔導書』を読んで詰まった箇所をダラダラ書く

Last updated at Posted at 2020-04-29

巷で難しい!わからない!と言われている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_UNORMDXGI_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)で、コマンドリストに積み重ねるコマンドが一覧で載っています。

  1. パイプラインステートのセット
  2. ルートシグネチャのセット
  3. ビューポートとシザー矩形のセット
  4. プリミティブトポロジのセット
  5. 頂点情報のセット
  6. 描画(Draw)命令

このあと、それぞれの実際のコードが書いてあるのですが、3. ビューポートとシザー矩形のセットに関しては書いてません。(前節のコラムp144で小さく書かれています)
これを書くのを忘れてたから描画されてませんでした。

ポリゴンにテクスチャを貼り付ける

エラーが出ないのにテクスチャが表示されない

ノイズのテクスチャを貼り付けたはずなのに、四角形が真っ黒になるという事象が発生しました。

解決

シェーダーリソースビューの設定値が間違えてました。

D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};

//srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UINT; // ← NG
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;  // ← OK

だいたいうまく表示されないのは設定値ミスが多いですね。

4
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?