【问题标题】:DirectX : cannot create an directx11 device even though my system says it supports itDirectX:即使我的系统表示支持,也无法创建 directx11 设备
【发布时间】:2020-11-16 19:29:42
【问题描述】:

我打开 dxdiag 应用,选择显示选项卡以检查支持的功能级别,这是结果

今天我的内存不足,因为我的一个芯片被炸毁了,现在在 2GB 内存上运行

看来我的设备支持 directx 功能级别 11 很棒

跳转到 Visual Studio 2019 我尝试创建 D3D11 设备

D3D_FEATURE_LEVEL levels[] = {                            //Supported Levels We Want 11 or above
                                D3D_FEATURE_LEVEL_9_1,
                                D3D_FEATURE_LEVEL_9_2,
                                D3D_FEATURE_LEVEL_9_3,
                                D3D_FEATURE_LEVEL_10_0,
                                D3D_FEATURE_LEVEL_10_1,
                                D3D_FEATURE_LEVEL_11_0,
                                D3D_FEATURE_LEVEL_11_1                               
  };
  D3D_FEATURE_LEVEL supported = {};
 
  HRESULT deviceCreate = D3D11CreateDevice(
                                            nullptr                                                         //Use Default Adapter
                                           ,D3D_DRIVER_TYPE_HARDWARE,0                                       //Use Hardware ,no software module provided
                                           ,D3D11_CREATE_DEVICE_BGRA_SUPPORT | D3D11_CREATE_DEVICE_DEBUG     //Flags for device creation
                                           ,levels,ARRAYSIZE(levels),D3D11_SDK_VERSION                       //Feature array,size of array,sdk to use
                                           ,&device,&supported,&context                                      //Created Device,supported level,context
                                          );
  if (FAILED(deviceCreate))
  {
    MessageBox(NULL, L"Failed To Create D3D11 Device", L"Failed DirectX", MB_OK);
    error = 1;
    return;
  }

  switch (supported)
  {
    case D3D_FEATURE_LEVEL_9_1:MessageBox(NULL, L"9_1", L"9_1", MB_OK);
    break;
    case D3D_FEATURE_LEVEL_9_2:MessageBox(NULL, L"9_2", L"9_2", MB_OK);
    break;
    case D3D_FEATURE_LEVEL_9_3:MessageBox(NULL, L"9_3", L"9_3", MB_OK);
    break;
    case D3D_FEATURE_LEVEL_10_0:MessageBox(NULL, L"10_0", L"10_0", MB_OK);
    break;
    case D3D_FEATURE_LEVEL_10_1:MessageBox(NULL, L"10_1", L"10_1", MB_OK);
    break;
    case D3D_FEATURE_LEVEL_11_0:MessageBox(NULL, L"11_0", L"11_0", MB_OK);
    break;
    case D3D_FEATURE_LEVEL_11_1:MessageBox(NULL, L"11_1", L"11_1", MB_OK);
  }

输出:

我查看了我的制造商网站和 Windows 更新,但都说您已经安装了最新的驱动程序。任何帮助将不胜感激

【问题讨论】:

  • 在 Debug->Graphics 下打开 DirectX 调试控制中心。有一个选项允许仅使用特定 API 进行调试。也许你已经打开它来使用 9_1。
  • 我打开了调试控制中心,但是窗口中的所有选项都是灰色的。我编辑了用户列表以包含整个调试目录,并且对功能级别没有限制,但它没有帮助
  • 如果从关卡中移除 d3d9 会发生什么?也许它需要最低支持
  • 是的,你是对的,我使用你的想法发布了解决方案

标签: c++ visual-studio-2019 directx-11


【解决方案1】:

正如 cmets 中建议的那样,删除支持的最低功能级别,即 9_1 是答案。

如果特征级别数组为空,则从文档中获取默认数组

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

使用与我传递的数组相同的数组,设备会检查支持哪些功能级别,但 IN ORDERFIRST 支持数组中的功能级别被退回[不是最适合您的设备]

因此,只需反转数组并将特征级别 11 放在数组的首位即可

【讨论】:

  • 很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。
猜你喜欢
  • 2013-08-06
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 2023-01-23
  • 1970-01-01
相关资源
最近更新 更多