3

C++ AMP で生成されたテクスチャをスクリーン バッファとして使用することはできますか?

C++ AMP コード (既に実行済み) を使用して画像を生成し、この画像を使用して Windows 8 メトロ アプリの画面全体を埋めたいと考えています。画像は 1 秒間に 60 回更新されます。

私は Direct3D にまったく精通していません。Direct2d テンプレート アプリを出発点として使用しました。

最初に C++ AMP コードのスワップ チェーンからバッファを直接操作しようとしましたが、そのテクスチャに書き込もうとするとエラーが発生しました。

GPU で AMP を使用してデータを処理し、それを CPU メモリに移動して、D2D API で使用できるビットマップを作成するのは効率が悪いようです。

スワップ チェーン バッファ テクスチャを C++ AMP で直接 (データが GPU から出ることなく) 操作できるようにするコードを誰かが共有できますか? または、少なくともそのバッファに GPU から出ない別のテクスチャからのデータを入力できますか?

4

1 に答える 1

3

AMP Texture<> と ID3D11Texture2D バッファーの間で相互運用できます。相互運用性の完全なコードとその他の例は、こちらの第 11 章のサンプルにあります

//  Get a D3D texture resource from an AMP texture.

texture<int, 2> text(100, 100);
CComPtr<ID3D11Texture2D> texture;
IUnknown* unkRes = get_texture(text); 
hr = unkRes->QueryInterface(__uuidof(ID3D11Texture2D), 
    reinterpret_cast<LPVOID*>(&texture));   
assert(SUCCEEDED(hr));

// Create a texture from a D3D texture resource

const int height = 100; 
const int width = 100;

D3D11_TEXTURE2D_DESC desc; 
ZeroMemory(&desc, sizeof(desc)); 
desc.Height = height; 
desc.Width = width; 
desc.MipLevels = 1; 
desc.ArraySize = 1; 
desc.Format = DXGI_FORMAT_R8G8B8A8_UINT; 
desc.SampleDesc.Count = 1; 
desc.SampleDesc.Quality = 0; 
desc.Usage = D3D11_USAGE_DEFAULT; 
desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE; 
desc.CPUAccessFlags = 0; 
desc.MiscFlags = 0;

CComPtr<ID3D11Texture2D> dxTexture = nullptr; 
hr = device->CreateTexture2D(&desc, nullptr, &dxTexture);
assert(SUCCEEDED(hr));

texture<uint4, 2> ampTexture = make_texture<uint4, 2>(dxView, dxTexture);
于 2013-03-26T05:16:41.957 に答える