是否可以使用 C++ AMP 生成的纹理作为屏幕缓冲区?
我想用我的 C++ AMP 代码生成一个图像(已经完成)并使用这个图像来填充 Windows 8 Metro 应用程序的整个屏幕。图像每秒更新 60 次。
我一点也不精通 Direct3D。我使用 Direct2d 模板应用程序作为起点。
首先,我尝试直接在 C++ AMP 代码中操作来自交换链的缓冲区,但任何写入该纹理的尝试都会导致错误。
在 GPU 上使用 AMP 处理数据,然后将其移动到 CPU 内存以创建我可以在 D2D API 中使用的位图似乎效率很低。
有人可以分享一段代码,让我可以直接使用 C++ AMP 操作交换链缓冲区纹理(没有数据离开 GPU),或者至少用来自另一个不会离开 GPU 的纹理的数据填充该缓冲区?
最佳答案
您可以在 AMP Texture<> 和 ID3D11Texture2D 缓冲区之间进行互操作。可以在 Chapter 11 samples here 中找到完整的代码和其他互操作示例。 .
// 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);
关于microsoft-metro - 将 C++ AMP 与 Direct2D 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15457694/