使用D3D11CreateDeviceAndSwapChain?

时间:2015-03-05 00:08:28

标签: c++ directx

我目前正在用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 = {{1 }}

当我运行它时,我得到的值类似于-5027 ...,所以这不起作用。我还查看了this文章来试试他们的内容,但最终导致计算机崩溃(我已经将代码修改为我的变量,结果是ID3D11DeviceContext*)。

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

提前致谢。

1 个答案:

答案 0 :(得分: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;
    }