directX创建交换链

问题描述 投票:4回答:1

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

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 );

对于此代码,没有解释,我只看了几本书,也没有对此代码的解释。

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

而且我不知道我了解queryInterface很好

请帮我解决这个问题

c++ directx
1个回答
11
投票

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

[基本上,当您首次创建Direct3D 11设备时,可以选择提供IDXGIAdapter实例以供使用。大多数人在此处传递nullptrNULL,只是让它在系统中的默认适配器上创建设备。但是,要完成交换链的设置,您需要DXGI工厂实例。从理论上讲,您可以使用DXGICreateFactory1自己创建一个,但您可以通过使用DXGICreateFactory或带有错误标志的DXGICreateFactory2轻松弄乱并得到“错误的一个”。

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

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

然后使用IDXGIAdapterIDXGIDevice获得IDXGIObject::GetParent

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

然后再次使用IDXGIFactoryIDXGIAdapter获得IDXGIObject::GetParent

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创建交换链的方法,如果首先使用D3D11CreateDeviceAndSwapChain而不是D3D11CreateDevice,您将获得基本相同的结果。对于DirectX 11.1或更高版本的系统,对于Win32桌面应用程序,应考虑使用IDXGIFactory2::CreateSwapChainForHwnd。对于Windows Store应用程序,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 */ );
}

请参见Anatomy of Direct3D 11 Create Device和Direct3D教程示例Win32 desktop app version

DirectX12用法明确禁止使用此代码模式。有关更多详细信息,请参见this blog post

© www.soinside.com 2019 - 2024. All rights reserved.