DirectX11 без прикрепленного окна?

13

Мне просто интересно, можно ли инициализировать и использовать DX11 или DX9 только для закадрового рендеринга - то есть без прикрепленного окна. Мое намерение состоит в том, чтобы сделать некоторые тесты GPU, прежде чем открывать фактическое окно. В этом бенчмаркинге визуализируется некоторая тестовая сцена, но она не должна быть видимой. (На самом деле в зависимости от оценки производительности открываются разные окна)

GPUquant
источник
2
С D3D11 вам нужно предоставить дескриптор окна при создании цепочки обмена, см. Здесь . Но, может быть, есть способ скрыть это окно?
Лоран Кувиду,
1
да, я знаю, что DX11 требует дескриптор окна для swapchain - но если вы делаете рендеринг вне экрана, вам действительно нужен какой-нибудь swapchain? Есть ли способ инициализации и рендеринга без swapchain - я думал, что swapchain только для рендеринга экрана ...
GPUquant
1
Прямо сейчас я пытаюсь использовать окно 1x1px, которое скрыто. Но это не хорошее решение, я бы сказал.
GPUquant

Ответы:

15

Да. Вы можете инициализировать устройство Direct3D с помощью D3D11CreateDeviceокна, которое не требует окна. Вы просто не создаете цепочку обмена вообще. Вы по-прежнему можете создавать цели закадрового рендера и рисовать их обычным способом. Вместо того, чтобы вызывать Presentцепочку обмена, вы можете позвонить, ID3D11DeviceContext::Flushчтобы пнуть GPU с работой, которую вы поставили в очередь.

Если позже вы захотите создать окно, вы можете уничтожить устройство и воссоздать его с помощью D3D11CreateDeviceAndSwapChainили вы можете создать цепочку подкачки и присоединить ее к существующему устройству с помощью IDXGIFactory::CreateSwapChain. (Это IDXGIFactoryотдельный COM-объект, который должен быть создан CreateDXGIFactoryпервым.)

Натан Рид
источник
+1 колл Flushвместо представления цепочки свопов, это здорово!
Лоран Кувиду
Это как-то возможно с D3D9 через IDirect3D9::CreateDeviceметод? Я не мог найти D3D9CreateDeviceметод, к сожалению.
Vinz
@ Винзенз Я так не думаю. D3D9 не разделяет понятия «устройство» и «цепочка обмена», как это делают D3D10 и выше. Они оба свернуты в объект устройства D3D9, который требуется HWNDсоздать.
Натан Рид