【发布时间】:2015-08-17 08:15:00
【问题描述】:
在为 win32 初始化 DirectX 11.1 时,我遵循 MSDN 示例代码。 该代码声明了两个 Direct3d 设备:
ID3D11Device* g_pd3dDevice = nullptr;
ID3D11Device1* g_pd3dDevice1 = nullptr;
然后像这样获取设备:
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
};
UINT numFeatureLevels = ARRAYSIZE( featureLevels );
hr = D3D11CreateDevice(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
createDeviceFlags,
featureLevels,
numFeatureLevels,
D3D11_SDK_VERSION,
&g_pd3dDevice,
&g_featureLevel,
&g_pImmediateContext );
if ( hr == E_INVALIDARG )
{
hr = D3D11CreateDevice(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
createDeviceFlags,
&featureLevels[1],
numFeatureLevels - 1,
D3D11_SDK_VERSION,
&g_pd3dDevice,
&g_featureLevel,
&g_pImmediateContext );
}
if( FAILED( hr ) )
return hr;
然后我们获取DXGIDevice:
IDXGIFactory1* dxgiFactory = nullptr;
IDXGIDevice* dxgiDevice = nullptr;
hr = g_pd3dDevice->QueryInterface( __uuidof(IDXGIDevice),
reinterpret_cast<void**>(&dxgiDevice)
);
然后我们得到适配器:
IDXGIAdapter* adapter = nullptr;
hr = dxgiDevice->GetAdapter(&adapter);
从适配器我们得到 IDXGIFactory1 接口:
hr = adapter->GetParent( __uuidof(IDXGIFactory1),
reinterpret_cast<void**>(&dxgiFactory) );
从IDXGIFactory1接口,我们请求IDXGIFactory2接口:
IDXGIFactory2* dxgiFactory2 = nullptr;
hr = dxgiFactory->QueryInterface( __uuidof(IDXGIFactory2),
reinterpret_cast<void**>(&dxgiFactory2)
);
如果 IDXGIFactory2 可用,我们请求 Direct3D11.1 设备接口。 同时获取ID3D11DeviceContext1接口:
if ( dxgiFactory2 )
{
// DirectX 11.1 or later
hr = g_pd3dDevice->QueryInterface( __uuidof(ID3D11Device1),
reinterpret_cast<void**>(&g_pd3dDevice1)
);
if (SUCCEEDED(hr))
{
(void) g_pImmediateContext->QueryInterface(
__uuidof(ID3D11DeviceContext1),
reinterpret_cast<void**> (&g_pImmediateContext1)
);
}
然后我们创建交换链:
hr = dxgiFactory2->CreateSwapChainForHwnd( g_pd3dDevice,
g_hWnd,
&sd,
nullptr,
nullptr,
&g_pSwapChain1 );
我的第一个问题是为什么此代码在创建交换链时使用 DirectX11 版本的设备?我们应该使用 g_pd3dDevice1 而不是 g_pd3dDevice 吗?
我的第二个问题是,即使我们可以获取directx11.1版本的接口,msdn示例代码还是从IDXGISwapChain1接口获取了IDXGISwapChain接口:
hr = g_pSwapChain1->QueryInterface( __uuidof(IDXGISwapChain),
reinterpret_cast<void**>(&g_pSwapChain) );
并在当前调用中使用该版本的交换链:
g_pSwapChain->Present( 0, 0 );
这是为什么呢?
【问题讨论】:
-
当然,这是一个典型的复制/粘贴错误。无论如何它肯定工作得很好,因为接口的实际实现是11.1代码。第二个只是更容易保持渲染循环与旧 DX 版本兼容。
-
感谢您的评论。你能解释一下,g_pd3dDevice的实际接口是11.1吗?因为当我在 g_pd3dDevice 上使用 CreateRasterizerState1 时,我没有编译。但它适用于 g_pd3dDevice1。
-
实现是11.1,不是接口。你看不到它。这是 Microsoft 用来保持其代码向后兼容的标准技术。
-
好的明白了。谢谢。
标签: c++ directx-11