direct3d — Расположенный на устройстве массив пикселей (от C ++ AMP) до окна, использующего D3D / D2D

у меня есть concurrency::array (C ++ AMP) цветов на устройстве, содержащих цвета для каждого пикселя.

Я хотел бы передать этот массив в Direct3D, чтобы он использовался в качестве буфера для отображения в окне без необходимости копировать данные на хост.

Я также пытался использовать concurrency::direct3d::make_array, который связывает ID3D11Buffer с accelerator_view, но я не знаю, как взять этот массив и передать его в Direct3D в качестве источника изображения, отображаемого в окне.

Кроме того, я мог бы преобразовать эти данные в текстуру.

Итак, основной вопрос: Учитывая часть информации о цвете для каждого пикселя, расположенного на устройстве, как передать их в Direct3D для использования в качестве своего рода экранного буфера? (Этот фрагмент просто вычисляется C ++ AMP.)

2

Решение

Текстура

Итак, как мы обсуждали в комментариях, вы можете работать с 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, которое может быть полезно для вас: один, два.

Надеюсь, поможет.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector