私はC++/D3D11の基本的なグラフィックスの概念を教えるためのシンプルなフレームワークを作成しています。このフレームワークは、単純なインタフェース機能(例えば、Putpixel(x,y,r,g,b)
)を介してスクリーンラスタコンテンツの直接操作を可能にすることが要求される。Direct3D 11のCPUからフレームバッファにアクセスする方法は?
D3D9では、CPUがサーフェスを構成するヒープにサーフェスバッファを割り当てることで、これは比較的簡単な目標でした。次に、バックバッファがロックされ、ヒープバッファの内容がバックバッファに転送されます。私が理解しているように、D3D11のCPUからバックバッファに直接アクセスすることはできません。テクスチャリソースを準備し、それをいくつかのフルスクリーンジオメトリを介してバックバッファに描画する必要があります。
私は、このような手順のために2つのシステムを考えました。第1のものは、D3D11_USAGE_DEFAULT
テクスチャとD3D11_USAGE_STAGING
テクスチャとを含む。ステージングテクスチャは、最初にマップされ、CPUから描画されます。シーンが完成すると、ステージングテクスチャはマップされず、CopyResource
(GPUを使用して誤っていない場合はコピーを実行)のデフォルトテクスチャにコピーされ、デフォルトのテクスチャがフルスクリーンのテクスチャ付きクワッドを介してバックバッファに描画されます。
第2のシステムは、D3D11_USAGE_DYNAMIC
テクスチャと、ヒープ上に割り当てられたフレームバッファとを含む。シーンが合成されると、ダイナミックテクスチャがマップされ、ヒープバッファの内容がCPUを介してダイナミックテクスチャにコピーされ、ダイナミックテクスチャはマップされず、フルスクリーンテクスチャ付きクワッドを介してバックバッファに描画されます。
私は、読み書きアクセスで作成されたテクスチャとD3D11_USAGE_STAGING
がシステムメモリに存在するとの印象を受けましたが、実行したパフォーマンステストはそうでないことを示しています。つまり、CPUを介して単純な200x200の塗りつぶし矩形を描画すると、ステージングテクスチャがヒープバッファよりも約3倍遅くなります(両方のケースで正確に同じ逆アセンブリ(タイトなrep stos
ループ))ので、ステージングテクスチャがグラフィックスアダプタメモリ。
これは、バックバッファへのレンダリングとシステムメモリからGPUへのグラフィックスメモリへのコピー作業の両方を可能にするので、ステージングテクスチャシステムを使用することをお勧めします。しかし、私はそのような能力を超えてCPUアクセス速度を優先させたいと思っています。
この方法の場合、どのような方法が最適ですか?どんなヒント、私の2つのアプローチの修正、または全く異なるアプローチの提案も大いに感謝されます。
ドライバがCPUの読み込みと書き込みの両方についてフラグが立てられたメモリの書き込み結合を指定するのは奇妙に思えます。ダイナミックテクスチャに関するあなたのアドバイスをありがとう、私はnooverwriteで複数のテクスチャとサイクリングを作成するあなたの方法を試してみます。また、目標はCPUの表面操作を教えることではなく、2D/3Dラスタグラフィックの基本的な概念(数学とアルゴリズム)を実践的に教えることです。 – chili