directX创建交换链

use*_*006 3 c++ directx

在我的书中,我编写了创建交换链的代码.

IDXGIDevice * dxgiDevice = 0;
mD3dDevice->QueryInterface( __uuidof( IDXGIDevice ),( void ** ) & dxgiDevice );

IDXGIAdapter * dxgiAdapter = 0;
dxgiDevice->GetParent( __uuidof( IDXGIAdapter ),( void ** ) & dxgiAdapter );

IDXGIFactory * dxgiFactory = 0;
dxgiAdapter->GetParent( __uuidof( IDXGIFactory ),( void ** ) & dxgiFactory );

dxgiFactory->CreateSwapChain( mD3dDevice, & sd, & mSwapChain );
Run Code Online (Sandbox Code Playgroud)

对于这段代码没有任何解释,我检查了很少的书籍,也有这个代码的noo解释.

请帮助mi.我真的不明白做什么做GetParent方法.idxgiDevice扩展idxgiObject.idxgiDevice的父级是idxgiObject,为什么它们使用指向idxgiFacory的指针作为参数.

我不知道我理解queryInterface好

请帮助mi

Chu*_*urn 10

此代码用于使用DirectX 11或更高版本的接口创建交换链,此模式专门用于确保您使用的DXGI工厂实例是在创建Direct3D 11设备时实际使用的实例.

基本上,当您第一次创建Direct3D 11设备时,您可以选择提供IDXGIAdapter要使用的实例.大多数人通过nullptrNULL在这里,只是让它在系统中的默认适配器上创建一个设备.但是,要完成设置交换链,您需要DXGI工厂实例.理论上你可以自己创建一个,DXGICreateFactory1但是你可以通过使用DXGICreateFactory或者DXGICreateFactory2使用错误的标志轻松搞砸并获得"错误的" .

相反,最安全的做法是IDXGIDeviceID3D11Device使用标准COM IUnknown :: QueryInterface获取:

IDXGIDevice * dxgiDevice = 0;
HRESULT hr = mD3dDevice->QueryInterface( __uuidof( IDXGIDevice ),( void ** ) & dxgiDevice );
if ( SUCCEEDED(hr) )
Run Code Online (Sandbox Code Playgroud)

然后IDXGIAdapterIDXGIDevice使用IDXGIObject :: GetParent获取:

IDXGIAdapter * dxgiAdapter = 0;
hr = dxgiDevice->GetParent( __uuidof( IDXGIAdapter ),( void ** ) & dxgiAdapter );
if ( SUCCEEDED(hr) )
Run Code Online (Sandbox Code Playgroud)

然后获得IDXGIFactoryIDXGIAdapter使用IDXGIObject ::的getParent再次:

IDXGIFactory * dxgiFactory = 0;
hr = dxgiAdapter->GetParent( __uuidof( IDXGIFactory ),( void ** ) & dxgiFactory );
if ( SUCCEEDED(hr) )
Run Code Online (Sandbox Code Playgroud)

现在,IDXGIFactory无论它是如何创建的,您都可以使用Direct3D 11设备.请记住,COM引用计数意味着您现在必须清理所有这些对象的引用:

dxgiFactory->Release();
dxgiAdapter->Release();
dxgiDevice->Release();
Run Code Online (Sandbox Code Playgroud)

请注意,这IDXGIFactory::CreateSwapChain是创建交换链的DirectX 11.0方式,如果您首先使用D3D11CreateDeviceAndSwapChain而不是D3D11CreateDevice,则会得到基本相同的结果.对于DirectX 11.1或更高版本的系统,您可以考虑使用IDXGIFactory2::CreateSwapChainForHwndWin32桌面应用程序.对于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 */ );
}
Run Code Online (Sandbox Code Playgroud)

请参阅Direct3D 11创建设备剖析和Direct3D教程示例Win32桌面应用程序版本Windows应用商店版本.