2

concurrency::array在设备上有一个(C++ AMP)颜色,为每个像素保存颜色。

我想将此数组提供给 Direct3D,以便将其用作在窗口中显示的缓冲区,而无需将数据复制到主机。

我也尝试使用concurrency::direct3d::make_array,它将 anID3D11Buffer与 an相关联accelerator_view,但我不知道如何获取此数组并将其作为窗口中显示的图像的源提供给 Direct3D。

或者,我可以将此数据转换为纹理。

所以基本问题是:给定设备上每个像素的一大块颜色信息,如何将它们提供给 Direct3D 以用作各种屏幕缓冲区?(这个块恰好是由 C++ AMP 计算的。)

4

1 回答 1

3

质地

因此,正如我们在评论中所讨论的,您可以使用 2D 纹理:

concurrency::graphics::texture<float_4, 2> tex(1920, 1200);

设备,然后是加速器

然后,要继续使用 DirectX 11,您必须拥有ID3D11DeviceID3D11DeviceContext. 最好手动创建,ID3D11Device然后根据您的设备ID3D11DeviceContext创建对象。accelerator_view来自 Julia2D 示例的示例代码:

accelerator_view av=concurrency::direct3d::create_accelerator_view(g_pd3dDevice);
texture<unorm4, 2> tex = make_texture<unorm4, 2>(av, pTexture);

加速器,然后设备

或者,您可以获取指向ID3D11DeviceID3D11DeviceContext来自现有accelerator_view对象的指针:


最后,渲染

使用ID3D11Device并且ID3D11DeviceContext您可以继续渲染(以DirectXTK 为例):

SpriteBatch* spriteBatch(new SpriteBatch(context));

spriteBatch->Begin();
spriteBatch->Draw(texture, XMFLOAT2(x, y));
spriteBatch->End();

另外,我发现这两个示例涉及 C++Amp/DirectX 互操作,这对您很有用:

希望能帮助到你。

于 2013-12-28T20:49:29.367 回答