没有窗口的DirectX11?


13

我只是想知道,是否有可能初始化DX11或DX9并将其仅用于屏幕外渲染-意味着没有附加的窗口。我的意图是在打开实际窗口之前进行一些GPU基准测试。在此基准测试中,呈现了一些测试场景,但不应看到。(实际上取决于基准分数,会打开不同的窗口)


2
使用D3D11,您需要在创建交换链时提供一个窗口句柄,请参见此处。但是也许有一种方法可以隐藏此窗口?
Laurent Couvidou

1
是的,我知道,DX11需要交换链的窗口句柄-但是,如果仅在屏幕外渲染,您真的需要交换链吗?有没有初始化和渲染而不需要swapchain的方法-我认为swapchain只是用于屏幕渲染...
GPUquant 2013年

1
现在,我正在尝试使用隐藏的1x1px窗口。但这不是一个很好的解决方案。
GPUquant

Answers:


15

是。您可以使用来初始化Direct3D设备D3D11CreateDevice,不需要窗口。您根本根本不创建交换链。您仍然可以创建屏幕外渲染目标并以通常的方式对其进行绘制。Present您可以调用ID3D11DeviceContext::Flush队列中的工作来踢GPU,而不必调用交换链。

如果以后要创建窗口,则可以使用销毁设备并重新创建它D3D11CreateDeviceAndSwapChain,也可以使用创建交换链并将其附加到现有设备上IDXGIFactory::CreateSwapChain。(这IDXGIFactory是一个单独的COM对象,需要首先创建CreateDXGIFactory。)


+1通话Flush而不是显示交换链,这很干净!
Laurent Couvidou

通过该IDirect3D9::CreateDevice方法,D3D9是否可以通过某种方式实现?我很难找到一种D3D9CreateDevice方法。
Vinz

@Vinzenz我不这么认为。D3D9并未像D3D10及更高版本那样将“设备”和“交换链”的概念分开。它们都被卷入D3D9设备对象,该对象需要HWND创建。
内森·里德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.