使用D3D11创建设备和交换链

Using D3D11CreateDeviceAndSwapChain?

本文关键字:交换 D3D11 创建 使用      更新时间:2023-10-16

我目前正在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…,所以这不起作用。我也看了这篇文章,尝试他们的方法,但它最终导致我的计算机崩溃(我对代码进行了一些修改,最终得到了D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, NULL, 0, D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, &m_device, &featureLevel, &m_deviceContext);)。

有人知道如何解决这个问题吗?我可以把我的整个程序上传到pastebin,只要问一下。此外,如果你想看一下,这里有教程的链接。

提前谢谢。

也许您的硬件不完全支持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标志表示D3Device将在硬件模式下创建。如果图形卡支持DX11功能级别,则程序将使用该图形卡的全部功能,否则创建将失败。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;
    }