使用 D3D11CreateDeviceAndSwapChain?

Posted

技术标签:

【中文标题】使用 D3D11CreateDeviceAndSwapChain?【英文标题】:Using D3D11CreateDeviceAndSwapChain? 【发布时间】:2015-03-05 00:08:28 【问题描述】:

我目前正在根据教程用 C++ 编写 DirectX 11 游戏引擎,但遇到了问题。这是错误所在:

result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL,    
0, &featureLevel, 1, D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, 
&m_device, NULL, &m_deviceContext);

结果 = HRESULT,featureLevel = D3D_FEATURE_LEVEL,swapChainDesc = DXGI_SWAP_CHAIN_DESC,m_swapChain = IDXGISwapChain*,m_device = ID3D11Device*,最后是 m_deviceContext = ID3D11DeviceContext*

当我运行它时,我得到一个类似于 -5027... 的值,所以这不起作用。我还查看了this 文章以尝试他们所拥有的,但它最终导致我的计算机崩溃(我对变量进行了一些修改,最终得到了D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, NULL, 0, D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, &m_device, &featureLevel, &m_deviceContext);)。

有谁知道如何解决这个问题?我可以将我的整个程序上传到 pastebin,请问。另外,如果您想查看教程,请here is the link。

提前致谢。

【问题讨论】:

【参考方案1】:

也许您的硬件不完全支持 DirectX11 功能级别, 所以尝试使用这个

result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_WARP, NULL,    
0, &featureLevel, 1, D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, 
&m_device, NULL, &m_deviceContext);

D3D_DRIVER_TYPE_HARDWARE 标志表示如果显卡支持DX11功能级别,D3Device将在硬件模式下创建,程序将使用该显卡的全部功能,否则创建将失败。 D3D_DRIVER_TYPE_WARP 标记,让D3Device使用软件模式,使程序能够在不支持DX11的显卡上运行,但不能全速运行。

有关驱动程序类型的更多信息,请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/ff476328(v=vs.85).aspx

因为您不确定应用运行的硬件,所以最好的做法是:

// Driver types
D3D_DRIVER_TYPE driverTypes[] =

    D3D_DRIVER_TYPE_HARDWARE,
    D3D_DRIVER_TYPE_WARP,
    D3D_DRIVER_TYPE_REFERENCE,
;

// feature levels
D3D_FEATURE_LEVEL featureLevels[] =

    D3D_FEATURE_LEVEL_11_0,
    D3D_FEATURE_LEVEL_10_1,
    D3D_FEATURE_LEVEL_10_0,
;

int numDriverTypes = ARRAYSIZE( driverTypes );
int numFeatureLevels = ARRAYSIZE( featureLevels );

您的应用将循环并使用这些数组中的每个功能级别测试每种驱动程序类型,如果成功,则 DXDevice 将使用正确的功能级别和驱动程序模式创建

 for( int driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex ++ )
    
       result = D3D11CreateDeviceAndSwapChain( NULL, driverTypes[driverTypeIndex], NULL, createDeviceFlags, featureLevels, numFeatureLevels,
                                            D3D11_SDK_VERSION, &swapChainDesc, &swapChain, &m_device, &featureLevel, &m_deviceContext);
        if( SUCCEEDED( result ) )
            break;
    

【讨论】:

以上是关于使用 D3D11CreateDeviceAndSwapChain?的主要内容,如果未能解决你的问题,请参考以下文章

D3D11:如何将 GDI 文本绘制到 GXDI 表面? (没有 D2D)

关于D3D11,你必须了解的几件事情

在 Windows 10 上使用 D3D11 调试层和 VS2013

D3D11:从 6 个图像创建立方体贴图

D3D11CreateDeviceAndSwapChain 未解决的外部

在 D3D11 中将纹理预加载到 GPU 内存