1

我正在学习使用 DirectX11 进行游戏编程的教程。当我运行示例代码时,它给了我这个错误:

First-chance exception at 0x76E12EEC in Chapter1.exe: Microsoft C++ exception: Platform::COMException ^ at memory location 0x0307E824. HRESULT:0x887A0004

问题似乎出在以下代码中的 featureLevel 和 creationFlag 中:

hr = D3D11CreateDevice(
            nullptr,
            D3D_DRIVER_TYPE_HARDWARE,
            nullptr,
            creationFlags, 
            featureLevels, 
            ARRAYSIZE(featureLevels),
            D3D11_SDK_VERSION, 
            &device, 
            &featureLevel,
            &context);  
    ThrowIfFailed(hr);

但是,如果我将 creationFlags 和 featureLevels 的值更改为 0 和 nullptr,则代码可以正常工作。我正在使用带有 Windows 8.1 和 Windows SDK 8.0 的 Visual Studio 2012。

以下是相关代码:

UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;

#if defined(_DEBUG)
    // For debugging
    creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

    D3D_FEATURE_LEVEL featureLevels[] = 
    {
        D3D_FEATURE_LEVEL_11_1,
        D3D_FEATURE_LEVEL_11_0,
    };

我读到了第一次机会异常,这并不意味着代码真的有问题,但它不会消失。我应该怎么办?

4

1 回答 1

3

问题

您只传递D3D_FEATURE_LEVEL_11_1and D3D_FEATURE_LEVEL_11_0,因此D3D11CreateDevice()函数失败,返回HRESULT不是S_OK并且您的ThrowIfFailed(hr);函数抛出异常。

如果您的 GPU 仅支持 DirectX 10,则无法创建 DirectX 11 硬件设备和上下文:Createdevice*()功能将失败。为了能够在低级硬件上使用 DirectX 11 API(但不是 DirectX 11 功能),Microsoft 引入了功能级别

怎么修?

只需使用传统的设备创建方式。您将需要传递具有所有可能功能级别的数组

D3D_FEATURE_LEVEL arrFeatLevels [] =
{
    D3D_FEATURE_LEVEL_11_1,
    D3D_FEATURE_LEVEL_11_0,
    D3D_FEATURE_LEVEL_10_1,
    D3D_FEATURE_LEVEL_10_0,
    D3D_FEATURE_LEVEL_9_3,
    D3D_FEATURE_LEVEL_9_2,
    D3D_FEATURE_LEVEL_9_1,
};

所以,DirectX API 会自动选择最高支持的一个。(创建设备后,您可以通过查看返回找到选择了哪一个&featureLevel):

if(featureLevel >= D3D_FEATURE_LEVEL_11_0)
    std::cout << "Yay! we using D3D11! :) " << std::endl;
else if( featureLevel >= D3D_FEATURE_LEVEL_10_0)
    std::cout << "Oh noes! only D3D10 available! :(" <<std::endl;
else
    std::cout << "Man, where did you take that old videocard? =\ " <<std::endl;

请注意,DirectX 11 功能(例如 Shader Model 5、曲面细分着色器;计算着色器)在功能级别低于D3D_FEATURE_LEVEL_11_0. 同样,DirectX 10 功能(例如几何着色器)在功能级别低于D3D_FEATURE_LEVEL_10_0. 所有硬件支持的功能都将照常运行。

此外,还有一些方法可以测试您的硬件不支持的功能。您可以创建软件模拟WARP 设备:通过D3D_DRIVER_TYPE_WARP。它非常慢并且不适合生产代码,但它允许开发人员测试和调试 D3D11 功能,即使他们没有顶级硬件。

在哪里可以找到我的 GPU 功能?

在 GPU 制造商的网站上。或者简单地使用GPU-Z(它显示 DX 支持)或GPU Caps Viewer(显示许多 OpenGL 功能)之类的工具。

编码快乐!=)

于 2013-11-07T08:27:37.580 回答