我在设备上有一个concurrency::array
(C ++ AMP)颜色,每个像素都有颜色。
我想将此数组提供给Direct3D,因此它可以用作缓冲区在窗口中显示而无需将数据复制到主机。
我还尝试使用concurrency::direct3d::make_array
,ID3D11Buffer
与accelerator_view
相关联,但我不知道如何将此数组作为源并将其作为源提供给Direct3D在窗口中显示的图像。
或者,我可以将此数据转换为纹理。
所以基本的问题是:给定位于设备上的每个像素的一大块颜色信息,如何将它们提供给Direct3D以用作各种屏幕缓冲区?(此块只是恰好由C ++ AMP计算。)
答案 0 :(得分:3)
因此,正如我们在评论中讨论的那样,您可以使用2D纹理:
concurrency::graphics::texture<float_4, 2> tex(1920, 1200);
然后,要继续使用DirectX 11,您必须拥有ID3D11Device
和ID3D11DeviceContext
。最好手动创建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);
或者,您可以从现有的accelerator_view
对象获取指向ID3D11Device
和ID3D11DeviceContext
的链接:
您使用concurrency::direct3d::get_device()
功能:
IUnknown* unknown = concurrency::direct3d::get_device(accelerator);
在已退回的IUnknown
对象上,您致电IUnknown::QueryInterface
将其投放到ID3D11Device
ID3D11Device* device = 0;
unknown->QueryInterface(__uuidof(ID3D11Device), &device));
然后您ID3D11DeviceContext
呼叫ID3D11Device::GetImmediateContext
:
ID3D11DeviceContext* context = 0;
device->GetImmediateContext(context);
使用ID3D11Device
和ID3D11DeviceContext
,您可以继续渲染(使用DirectXTK示例):
SpriteBatch* spriteBatch(new SpriteBatch(context));
spriteBatch->Begin();
spriteBatch->Draw(texture, XMFLOAT2(x, y));
spriteBatch->End();
另外,我发现这两个样本涉及C ++ Amp / DirectX互操作,对您有用:one,two。
希望,这有帮助。