у меня есть concurrency::array
(C ++ AMP) цветов на устройстве, содержащих цвета для каждого пикселя.
Я хотел бы передать этот массив в Direct3D, чтобы он использовался в качестве буфера для отображения в окне без необходимости копировать данные на хост.
Я также пытался использовать concurrency::direct3d::make_array
, который связывает ID3D11Buffer
с accelerator_view
, но я не знаю, как взять этот массив и передать его в Direct3D в качестве источника изображения, отображаемого в окне.
Кроме того, я мог бы преобразовать эти данные в текстуру.
Итак, основной вопрос: Учитывая часть информации о цвете для каждого пикселя, расположенного на устройстве, как передать их в Direct3D для использования в качестве своего рода экранного буфера? (Этот фрагмент просто вычисляется C ++ AMP.)
Итак, как мы обсуждали в комментариях, вы можете работать с 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);
Кроме того, вы можете получить указатели на ID3D11Device
а также ID3D11DeviceContext
из вашего существующегоaccelerator_view
объект:
ты используешь 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, которое может быть полезно для вас: один, два.
Надеюсь, поможет.
Других решений пока нет …