设备定位的像素阵列(从C ++ AMP)到使用D3D / D2D的窗口

时间:2013-12-27 16:45:35

标签: c++ direct3d c++-amp

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

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

我还尝试使用concurrency::direct3d::make_arrayID3D11Bufferaccelerator_view相关联,但我不知道如何将此数组作为源并将其作为源提供给Direct3D在窗口中显示的图像。

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

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

1 个答案:

答案 0 :(得分:3)

纹理

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

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

设备,然后是加速器

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

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

加速器,然后是设备

或者,您可以从现有的accelerator_view对象获取指向ID3D11DeviceID3D11DeviceContext的链接:


最后,渲染

使用ID3D11DeviceID3D11DeviceContext,您可以继续渲染(使用DirectXTK示例):

SpriteBatch* spriteBatch(new SpriteBatch(context));

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

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

希望,这有帮助。