質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

1回答

842閲覧

DirectX12 Null descriptorとは

YOUtree

総合スコア5

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2022/07/30 10:21

前提

DirectX-Graphics-Samples-master/Samples/Desktop/D3D12Multithreading中の153行目からのコード(C++_1)に
CBVとSRVのほかにnullSrvCountとして2個追加しているのはなぜでしょうか。

実際にnullSrvを作っている(C++_2)ところのコメントやリファレンスを読んでも、実際どういったときに使うのかがよくわかりませんでした。

実際に自分で3Dゲームを作った際には必要なCBVとSRV分のヒープを作成してうまく動作しているということもあり、そもそも設定する必要があるのかどうかも疑問です。

このNull Descriptor を用意するメリットや使い道などを教えていただければ幸いです。

C++_1

1 const UINT nullSrvCount = 2; // Null descriptors are needed for out of bounds behavior reads. 2 const UINT cbvCount = FrameCount * 2; 3 const UINT srvCount = _countof(SampleAssets::Textures) + (FrameCount * 1); 4 D3D12_DESCRIPTOR_HEAP_DESC cbvSrvHeapDesc = {}; 5 cbvSrvHeapDesc.NumDescriptors = nullSrvCount + cbvCount + srvCount; 6 cbvSrvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; 7 cbvSrvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; 8 ThrowIfFailed(m_device->CreateDescriptorHeap(&cbvSrvHeapDesc, IID_PPV_ARGS(&m_cbvSrvHeap))); 9 NAME_D3D12_OBJECT(m_cbvSrvHeap);

C++_2

1 // Describe and create 2 null SRVs. Null descriptors are needed in order 2 // to achieve the effect of an "unbound" resource. 3 D3D12_SHADER_RESOURCE_VIEW_DESC nullSrvDesc = {}; 4 nullSrvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; 5 nullSrvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; 6 nullSrvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 7 nullSrvDesc.Texture2D.MipLevels = 1; 8 nullSrvDesc.Texture2D.MostDetailedMip = 0; 9 nullSrvDesc.Texture2D.ResourceMinLODClamp = 0.0f; 10 11 m_device->CreateShaderResourceView(nullptr, &nullSrvDesc, cbvSrvHandle); 12 cbvSrvHandle.Offset(cbvSrvDescriptorSize); 13 14 m_device->CreateShaderResourceView(nullptr, &nullSrvDesc, cbvSrvHandle); 15 cbvSrvHandle.Offset(cbvSrvDescriptorSize);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

マルチスレッドでの描画ということで、かなり複雑な仕組みになってるようなので、しっかり見るには1日かかってしまうのですが、ざっと見たところ

  • リスト影パスと描画パスで同じルートシグネチャを使用している
  • 頂点シェーダは共通
  • スレッドの数はライトの数と同じ(3つ)
  • やたらとテクスチャ(ディフューズ・ノーマル合わせて74個)があり、それが頻繁に切り替わる(とRootSignatureのコメントに書いています)

考えてもよく分かりませんでしたが、その「頻繁に切り替わる部分」が関係してるのではないかと思います。
時間がなかったので、きっちり解析で来てませんが、なにかヒントになればと思います。

おそらくマルチスレッドサンプルなので、その辺が関係しているのではと思います。

ひとまず、ヒントになりそうな記事を見つけましたので貼っておきます。
https://www.intel.com/content/www/us/en/developer/articles/technical/understanding-directx-multithreaded-rendering-performance-by-experiments.html
マルチスレッド部分の利用法の部分がご理解できていれば、このサンプルは書き方の問題でしかないと思いますので、あまり気にしないほうが良いのかなとも思います。

投稿2022/07/30 16:14

編集2022/07/30 16:37
CTsuchinoko

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YOUtree

2022/08/03 11:18

返信が遅くなってすみません。(アクセスできなくて...) 回答と記事拝見させていただきました。 あれから、色々ためしてみたもののあまり納得の行く結果は出せていませんが 調査は続けつつ、とりあえずスレッドを使わないで作る場合はは気にせずに行こうと思います。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問