Direct3D 11 - 此系统不支持指定的设备接口或功能级别

问题描述 投票:0回答:1

我是 Direct3D 新手并尝试执行这段代码:

#include <iostream>

#include <windows.h>
#include <d3d11.h>
#include <d3dcompiler.h>

#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "d3dcompiler.lib")
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "comctl32.lib")

using namespace std;

int main()
{
    ID3D11Device* g_pDevice = NULL;
    IDXGISwapChain* g_pSwapChain = NULL;
    ID3D11DeviceContext* g_pContext = NULL;
    D3D_FEATURE_LEVEL g_featureLevel;
    D3D_DRIVER_TYPE g_driverType;

    HRESULT hr = S_OK;

    UINT createDeviceFlags = D3D11_CREATE_DEVICE_VIDEO_SUPPORT;

#ifdef _DEBUG
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
    printf(">Got rect\n");

    D3D_DRIVER_TYPE driverTypes[] =
    {
        D3D_DRIVER_TYPE_HARDWARE,
        D3D_DRIVER_TYPE_WARP,
        D3D_DRIVER_TYPE_REFERENCE,
    };
    D3D_FEATURE_LEVEL featureLevels[] =
    {
        D3D_FEATURE_LEVEL_11_1,
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1,
        D3D_FEATURE_LEVEL_10_0,
    };
    DXGI_SWAP_CHAIN_DESC sd;
    ZeroMemory(&sd, sizeof(sd));
    sd.BufferCount = 1;
    sd.BufferDesc.Width = 700;
    sd.BufferDesc.Height = 600;
    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    sd.BufferDesc.RefreshRate.Numerator = 75;
    sd.BufferDesc.RefreshRate.Denominator = 1;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    sd.OutputWindow = NULL;
    sd.SampleDesc.Count = 1;
    sd.SampleDesc.Quality = 0;
    sd.Windowed = TRUE;
    printf(">Checking drivers\n");
    for (UINT i = 0; i < ARRAYSIZE(driverTypes); i++)
    {
        g_driverType = driverTypes[i];
        hr = D3D11CreateDeviceAndSwapChain(
            NULL,
            g_driverType,
            NULL,
            createDeviceFlags,
            featureLevels,
            ARRAYSIZE(featureLevels),
            D3D11_SDK_VERSION,
            &sd,
            &g_pSwapChain,
            &g_pDevice,
            &g_featureLevel,
            &g_pContext
        );
        printf(">>Driver type: %ld\n", g_driverType);
        if (SUCCEEDED(hr)) break;
    }
    LPSTR s = (LPSTR)calloc(512, 1);
    FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, hr, 0, s, 512, NULL);
    printf("%s\n", s);
    return 0;
}

...我收到一条错误消息,提示我没有适合该程序的驱动程序

有趣的是,当我在没有任何顶点缓冲区和三角形*的情况下测试它时,我可以成功执行此代码。但突然添加它们会导致驱动程序错误...... 我试图在这里找到答案,但有人遇到了特定驱动程序类型的问题,我什至无法使用其中任何一个运行该程序。我还观看了 YouTube 教程,该教程建议安装可以处理来自应用程序的消息的程序(它是关于游戏等最终产品,我有一个调试程序)。谢谢你

*- 看来我是否初始化几何图形并不重要

附注更改了代码以匹配“最小、可重现的示例”规则,因此现在您可以自己尝试(如果您有 Windows SDK)

c winapi directx direct3d
1个回答
0
投票

我终于在这里找到了问题:我在 main.cpp 文件中有这段代码:

Window* mw = new Window(800, 600, "Name"); // Window init
Scene* sc = new Scene(mw->g_hWnd, 75); // DirectX init
if (!mw->Show() || !sc->Check())
{
    delete mw;
    delete sc;
    return -1;
}

并且看起来

Window
构造函数不会初始化窗口本身,而是初始化具有
mw->Show()
调用的
InitInstance()
。这就是我编辑代码的原因:

Window* mw = new Window(800, 600, "Name"); // Window init
if (!mw->Show())
{
    delete mw;
    return -1;
}
Scene* sc = new Scene(mw->g_hWnd, 75); // DirectX init
if (!sc->Check())
{
    delete mw;
    delete sc;
    return -1;
}

如果您仍然遇到此错误,请检查此网站。似乎有人用更复杂的英语重写了我的问题并回答了:)

© www.soinside.com 2019 - 2024. All rights reserved.