DirectX11 senza finestra collegata?


13

Mi chiedo solo se è possibile inizializzare e utilizzare DX11 o DX9 solo per il rendering offscreen, ovvero senza finestra collegata. La mia intenzione è di fare alcuni benchmarking GPU prima di aprire la finestra reale. In questo benchmarking viene riprodotta una scena di test, ma non dovrebbe essere visibile. (In realtà a seconda del punteggio di riferimento vengono aperte diverse finestre)


2
Con D3D11 è necessario fornire un handle di finestra durante la creazione della catena di scambio, vedere qui . Ma forse c'è un modo per nascondere questa finestra?
Laurent Couvidou,

1
sì, lo so, il DX11 richiede la maniglia della finestra per lo swapchain - ma se si esegue il rendering offscreen è davvero necessaria alcuna swapchain? C'è un modo per inizializzare e renderizzare senza swapchain - Pensavo che lo swapchain fosse solo per il rendering dello schermo ...
GPUquant

1
In questo momento sto cercando di utilizzare la finestra 1x1px che è nascosta. Ma non è una bella soluzione, direi.
GPUquant,

Risposte:


15

Sì. È possibile inizializzare il dispositivo Direct3D utilizzando D3D11CreateDevice, che non richiede finestre. Semplicemente non si crea affatto una catena di scambio. Puoi comunque creare target di rendering fuori schermo e disegnarli come al solito. Invece di chiamare Presentla catena di scambio, puoi chiamare ID3D11DeviceContext::Flushper dare il calcio alla GPU con il lavoro che hai messo in coda.

Se in seguito desideri creare una finestra, puoi distruggere il dispositivo e ricrearlo con D3D11CreateDeviceAndSwapChain, oppure puoi creare una catena di scambio e collegarla al dispositivo esistente con IDXGIFactory::CreateSwapChain. ( IDXGIFactoryÈ un oggetto COM separato che deve essere creato per CreateDXGIFactoryprimo.)


+1 Chiamare Flushinvece di presentare la catena di scambio, questo è pulito!
Laurent Couvidou,

Questo è in qualche modo possibile con D3D9 tramite il IDirect3D9::CreateDevicemetodo? D3D9CreateDevicePurtroppo non sono riuscito a trovare un metodo.
Vinz,

@Vinzenz Non la penso così. D3D9 non separa i concetti di "dispositivo" e "catena di scambio", come fanno D3D10 e successivi. Entrambi sono inseriti nell'oggetto dispositivo D3D9, che richiede una HWNDcreazione.
Nathan Reed,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.