此代码用于使用 DirectX 11 或更高版本的接口创建交换链,此模式专门设计用于确保您使用的 DXGI 工厂实例是创建 Direct3D 11 设备时实际使用的实例。
基本上,当您第一次创建 Direct3D 11 设备时,您可以选择提供IDXGIAdapter
要使用的实例。大多数人都通过nullptr
or NULL
在这里,让它在系统中的默认适配器上创建一个设备。但是,要完成交换链的设置,您需要 DXGI 工厂实例。理论上你可以使用自己创建一个DXGICreateFactory1
但你很容易搞砸并通过使用得到“错误的”DXGICreateFactory
或者可能DXGICreateFactory2
带有错误的标志。
相反,最安全的做法是获取IDXGIDevice
从你的ID3D11Device
使用标准COMIUnknown::查询接口 http://msdn.microsoft.com/en-us/library/windows/desktop/ms682521.aspx:
IDXGIDevice * dxgiDevice = 0;
HRESULT hr = mD3dDevice->QueryInterface( __uuidof( IDXGIDevice ),( void ** ) & dxgiDevice );
if ( SUCCEEDED(hr) )
然后得到IDXGIAdapter
来自IDXGIDevice
using IDXGIObject::GetParent http://msdn.microsoft.com/en-us/library/windows/desktop/bb174542.aspx:
IDXGIAdapter * dxgiAdapter = 0;
hr = dxgiDevice->GetParent( __uuidof( IDXGIAdapter ),( void ** ) & dxgiAdapter );
if ( SUCCEEDED(hr) )
然后得到IDXGIFactory
来自IDXGIAdapter
using IDXGIObject::GetParent http://msdn.microsoft.com/en-us/library/windows/desktop/bb174542.aspx again:
IDXGIFactory * dxgiFactory = 0;
hr = dxgiAdapter->GetParent( __uuidof( IDXGIFactory ),( void ** ) & dxgiFactory );
if ( SUCCEEDED(hr) )
现在你拥有了IDXGIFactory
与您的 Direct3D 11 设备关联,无论它是如何创建的。请记住,COM 引用计数意味着您现在必须清理对所有这些对象的引用:
dxgiFactory->Release();
dxgiAdapter->Release();
dxgiDevice->Release();
注意IDXGIFactory::CreateSwapChain
是 DirectX 11.0 创建交换链的方式,如果您使用过,您会得到基本相同的结果D3D11创建设备和交换链 http://msdn.microsoft.com/en-us/library/windows/desktop/ff476083.aspx而不是D3D11创建设备 http://msdn.microsoft.com/en-us/library/windows/desktop/ff476082.aspx首先。对于 DirectX 11.1 或更高版本的系统,您可以考虑使用IDXGIFactory2::CreateSwapChainForHwnd
而用于 Win32 桌面应用程序。对于 Windows 应用商店应用程序、Windows Phone 8 和 Xbox One,您始终使用IDXGIFactory2::CreateSwapChainForCoreWindow
.
对于 Win32 桌面应用程序,您可以按照上面的代码执行以下操作:
IDXGIFactory2* dxgiFactory2 = 0;
hr = dxgiFactory->QueryInterface( __uuidof(IDXGIFactory2), reinterpret_cast<void**>(&dxgiFactory2) );
if ( SUCCEEDED(hr) )
{
// This system has DirectX 11.1 or later installed, so we can use this interface
dxgiFactory2->CreateSwapChainForHwnd( /* parameters */ );
dxgiFactory2->Release();
}
else
{
// This system only has DirectX 11.0 installed
dxgiFactory->CreateSwapChain( /* parameters */ );
}
See Direct3D 11 创建设备剖析 https://walbourn.github.io/anatomy-of-direct3d-11-create-device/以及 Direct3D 教程示例Win32桌面应用程序版本 https://github.com/walbourn/directx-sdk-samples/tree/master/Direct3D11Tutorials.
DirectX12 的使用明确禁止此代码模式。有关更多详细信息,请参阅这篇博文 https://walbourn.github.io/anatomy-of-direct3d-12-create-device/.