microsoft-metro - 将 C++ AMP 与 Direct2D 结合使用

标签 microsoft-metro textures direct3d direct2d c++-amp

是否可以使用 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/

相关文章:

c++ - 使用片段着色器计算纹素

javascript - 如何在 Three.js 中正确渲染小网格上的大纹理?

windows-xp - 远程桌面上的 Direct3D

c++ - 弯路捕捉质感

css - 如何更改 Metro UI 中输入控件的大小?

deployment - Windows 8 模拟器命令行界面

c++ - OpenGL glTexSubImage 数据打包

c++ - 我可以告诉 direct3d 使用 alpha channel 渲染吗?

c# - C++/CX 组件 "public enum class"在 C# Metro App 中没有正确链接

windows-8 - Windows 8 Metro 是否支持托管 c++/cli