3

是否可以将 C++ AMP 生成的纹理用作屏幕缓冲区?

我想用我的 C++ AMP 代码(已经完成)生成一个图像,并使用这个图像来填充 Windows 8 Metro 应用程序的整个屏幕。图像每秒更新 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 回答