Direct2D работает только при создании устройства Direct3D 10.1, но он может обмениваться поверхностями с Direct3D 11. Все, что вам нужно, это создать оба устройства и визуализировать весь ваш контент Direct2D в текстуру, разделить между ними. Я использую эту технику в своих собственных приложениях, чтобы использовать Direct2D с Direct3D 11. Это влечет за собой небольшие затраты, но оно мало и постоянно на кадр.
Основная схема процесса, который вам нужно будет использовать:
- Создайте устройство Direct3D 11, как обычно.
- Создайте текстуру с параметром D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX, чтобы разрешить доступ к интерфейсу ID3D11KeyedMutex.
- Используйте GetSharedHandle , чтобы получить указатель на текстуру, которая может использоваться несколькими устройствами.
- Создайте устройство Direct3D 10.1, убедившись, что оно создано на том же адаптере.
- Используйте функцию OpenSharedResource на устройстве Direct3D 10.1, чтобы получить версию текстуры для Direct3D 10.1.
- Получите доступ к интерфейсу D3D10 KeyedMutex для текстуры.
- Используйте версию текстуры Direct3D 10.1 для создания RenderTarget с использованием Direct2D.
- Если вы хотите выполнить рендеринг с D2D, используйте мьютекс с ключами, чтобы заблокировать текстуру для устройства D3D10. Затем приобретите его в D3D11 и визуализируйте текстуру, как вы, вероятно, уже пытались это сделать.
Это не тривиально, но работает хорошо, и именно так они и хотели, чтобы вы взаимодействовали между ними. Похоже, что Windows 8 представит полную совместимость с D3D11, поэтому она будет такой же простой, как вы ожидаете.