使用C++ AMP与Direct2D

3

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

我想用我的C++ AMP代码生成一张图片(已经完成),然后使用这张图片填充Windows 8 Metro应用程序的整个屏幕。这张图片每秒更新60次。

我不太熟悉Direct3D。我使用Direct2d模板应用程序作为起点。

首先,我尝试在C++ AMP代码中直接操作交换链中的缓冲区,但是尝试写入那个纹理会导致错误。

使用AMP在GPU上处理数据,然后将其移动到CPU内存以创建位图,以便在D2D API中使用,这种方式效率很低。

有人可以分享一段代码,使我能够直接使用C++ AMP操作交换链缓冲区纹理(无需数据离开GPU),或者至少用来自不离开GPU的另一个纹理的数据填充该缓冲区吗?

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接