使用 D3D11CreateDeviceAndSwapChain?

Using D3D11CreateDeviceAndSwapChain?

我目前正在根据教程用 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);

result = 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 如果您想查看教程,请转到教程。

提前致谢。

可能您的硬件不完全支持 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[ 的显卡上=31=] 但不是全速。

有关驱动程序类型的详细信息,请参阅 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;
    }