3

このDirect3dプログラミングのヒントによると、私が書いているプログラムは、フレームごとに重要な計算を適用した後、フレームごとに1回頂点を変更します

このようなタスクには動的バッファを使用する必要がありますが、パフォーマンスは期待できると書かれており、Web を検索すると頂点バッファを更新する最速の方法が見つかりました

Xoofx の回答 (Sharpdx のデザイナー) まで下にスクロールすると、サブリソースの更新は動的バッファーを使用するよりも優れており、私の知る限り、サブリソースの更新はデフォルトのバッファーでのみ使用されます。

どの使用法を使用すればよいですか? (ステージング) とは何ですか?

C++ AMP を使用して計算を行うことにした場合 (GPU をプロセッサとして使用することは理解しています)、バッファの使用をデフォルトに設定し、C++ AMP を使用して CPU からアクセスする方法はありますか?

4

1 に答える 1

2

関数を使用して、プログラムで既存の Direct3D バッファーに関連付けられた C++ AMP 配列を作成できますmake_array()

template<typename T, int N>
array<T,N> make_array(const extent& ext, IUnknown* buffer);

Direct3D バッファーは、ID3D11Bufferインターフェイスを実装する必要があります。未加工のビュー ( ) をサポートし、 バインドD3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWSを許可する必要があります。バッファ自体は、エクステントのサイズにバッファ タイプのサイズを掛けた正しいサイズである必要があります。SHADER_RESOURCEUNORDERED_ACCESS

このget_buffer()関数は逆の操作をサポートし、配列から Direct3D バッファー インターフェイスを取得します。デバイスを取得する場合と同様に、返さIUnknownれた に対して目的のインターフェイスを照会する必要があります。

HRESULT hr = S_OK;
array<int, 1> arr(1024);
CComPtr<ID3D11Buffer> buffer;
IUnknown* unkBuf = get_buffer(arr);
hr = unkBuf->QueryInterface(__uuidof(ID3D11Buffer), reinterpret_cast<LPVOID*>(&buffer));
于 2013-05-15T17:42:09.180 に答える