D3D11CreateDevice() 返回垃圾值并失败

2024-01-22

我刚刚开始用这本书学习直接3D使用 DirectX11 进行 3D 游戏编程.

我按照第一个教程进行操作,并收到一个消息框,显示“D3D11CreateDevice Failed”。

我检查了这个函数的返回值,得到了垃圾值-2005270483。 的十六进制值0x887a002d,人们说它是DXGI_ERROR_SDK_COMPONENT_MISSING error.

但是,我找不到任何有关它的信息。而且,它也没有任何可能的价值D3D11CreateDevice()MSDN 通知的。

以下是书中创建D3D设备的代码:

bool D3DApp::InitDirect3D()
{
    // Create the device and device context.

    UINT createDeviceFlags = 0;
#if defined(DEBUG) || defined(_DEBUG)  
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

    D3D_FEATURE_LEVEL featureLevel;
    HRESULT hr = D3D11CreateDevice(
        0,                 // default adapter
        md3dDriverType,
        0,                 // no software device
        createDeviceFlags, // createDeviceFlags, 
        0, 0,              // default feature level array
        D3D11_SDK_VERSION,
        &md3dDevice,
        &featureLevel,
        &md3dImmediateContext);

    if( FAILED(hr) )
    {
        // I added this part to check out the return value
        TCHAR str[100];
        int code = -1;

        switch(hr) {
        case D3D11_ERROR_FILE_NOT_FOUND: code=0;
            break;
        case D3D11_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS: code=1;
            break;
        case D3D11_ERROR_TOO_MANY_UNIQUE_VIEW_OBJECTS: code=2;
            break;
        case D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD: code=3;
            break;
        case DXGI_ERROR_INVALID_CALL: code=4;
            break;
        case DXGI_ERROR_WAS_STILL_DRAWING: code=5;
            break;
        case E_FAIL: code=6;
            break;
        case E_INVALIDARG: code=7;
            break;
        case E_OUTOFMEMORY: code=8;
            break;
        case E_NOTIMPL: code=9;
            break;
        case S_FALSE: code=10;
            break;
        case S_OK: code=11;
            break;
        } // switch
        _stprintf(str, L"D3D11CreateDevice Failed. Code:%ld %d", hr, code);

        MessageBox(0, str, 0, 0);
        return false;
    } // if
...

我目前正在使用带有 DirectX 版本 11 的 Windows 8.1。 我的显卡是 NVIDIA GeForce GTX 650。 我使用的编译器是VS2010 Express。

有谁知道问题和解决方案是什么?


问题是您没有为您的操作系统安装正确的 DirectX 调试运行时。 The 旧版 DirectX SDK http://blogs.msdn.com/b/chuckw/archive/2013/07/01/where-is-the-directx-sdk-2013-edition.aspx(2010 年 6 月)具有适用于 Windows Vista SP2 和 Windows 7 又名 DirectX 11.0 的正确 DirectX 调试运行时,但不适用于 Windows 8.0、Windows 8.1 或带有 KB 的 Windows 7 SP12670838 http://support.microsoft.com/kb/2670838又称为 DirectX 11.1 或 DirectX 11.2。

对于 Windows 8.1,安装正确的 DirectX 调试运行时的唯一方法是安装 Windows 8.1 SDK。如果您已安装 Visual Studio 2013,则此操作会自动完成,或者您可以直接在系统上安装 SDK。您还可以通过安装 Visual Studio 2013 远程调试工具包来获取 Windows 8.1 SDK 调试运行时。看Direct3D SDK 调试层技巧 http://blogs.msdn.com/b/chuckw/archive/2012/11/30/direct3d-sdk-debug-layer-tricks.aspx查看调试运行时与 SDK 匹配的完整表格。

请注意,独立安装 Windows 8.1 SDK 并继续将旧版 DirectX SDK(2010 年 6 月)与 VS 2010 结合使用就足够了D3D11_CREATE_DEVICE_DEBUG再次在 Windows 8.1 上工作,但我建议 (a) 升级到 VS 2012 或 VS 2013 -或者 - (b) 使用“道具”解决方案 http://blogs.msdn.com/b/chuckw/archive/2013/10/18/visual-studio-2013-and-windows-8-1-sdk-rtm-are-now-available.aspx将 Windows 8.1 SDK 与 VS 2010 集成以获得最新版本的标头。这DirectX 工具包 http://go.microsoft.com/fwlink/?LinkId=248929这样做是为了支持 VS 2010。

如果您需要继续在 VS 2010 项目中使用旧版 DirectX SDK 组件(例如 D3DX11),那么您可以将 Windows 8.1 SDK 与 DirectX SDK 结合使用,但请务必列出 DirectX SDK 包含和 lib 路径afterWindows 8.1 SDK 的 include 和 lib 路径(请参阅MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/ee663275.aspx).

总结:理想的解决方案是仅在 Windows 8.1 上使用 Visual Studio 2013,根本不使用旧版 DirectX SDK。这Win32桌面Direct3D教程 http://code.msdn.microsoft.com/Direct3D-Tutorial-Win32-829979ef or the Windows 应用商店应用 Direct3D 教程 http://code.msdn.microsoft.com/windowsapps/Direct3D-Tutorial-Sample-08667fb0完全不需要旧版 DirectX SDK 即可构建良好。许多 DirectX SDK 示例现已在MSDN 代码库 http://blogs.msdn.com/b/chuckw/archive/2013/09/20/directx-sdk-samples-catalog.aspx使用 Windows 8.x SDK 构建,不使用旧版 DirectX SDK。

解决当前问题的最小解决方案是安装Windows 8.1 SDK http://go.microsoft.com/fwlink/?LinkID=323507或 Visual Studio 2013 远程调试工具 (x86 http://go.microsoft.com/?linkid=9832075 or x64 http://go.microsoft.com/?linkid=9832085)以获得为您的操作系统安装的正确版本的 SDKDebugLayers,但请记住 Frank Luna 的书现在已经相当过时了。看书籍推荐 http://blogs.msdn.com/b/chuckw/archive/2014/04/07/book-recommendations.aspx一些附加说明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D3D11CreateDevice() 返回垃圾值并失败 的相关文章

随机推荐

  • 红点标记 BitBucket 差异视图

    我们最近将源代码从 SVN 和 TFVC 迁移到了 Git 我们的代码库主要由在 VS2017 中编辑的 C 和 VB NET 文件组成 我们的 Git 存储库托管在 BitBucket 中 但我们存在差异问题 如下所示 BitBucket
  • 如何删除swarm中未使用的docker镜像?

    我们有一个系统 用户可以在其中安装一些 docker 容器 我们对他可以安装的内容没有限制 一段时间后 我们需要清理 删除群中未使用的所有图像 使用 docker 远程 API 的解决方案是什么 我们的想法是让背景图像垃圾收集器线程 列出所
  • 从使用 WCF WebHttp API 实现的服务中的 POST 方法获取原始 xml

    我正在使用 RESTful 方法构建 Web 服务 并使用 WCF WebHttp API NET v4 为了满足一些遗留功能 我需要通过 POST 接受原始 XML 消息并对其进行处理 例如 我的方法之一如下所示 WebInvoke Ur
  • 使用 javax.xml.soap.SOAPConnection 设置套接字读取超时

    我正在使用javax xml soap API javax xml soap SOAPConnectionFactory javax xml soap SOAPConnection和朋友 对远程服务器进行 Web 服务调用 大部分都取得了巨
  • 错误 MSB3644:找不到框架“.NETFramework,Version=v5.0”的参考程序集

    当我将项目更新到 Net 5 时 我使用天蓝色管道 我在构建解决方案步骤中收到此错误 错误 MSB3644 找不到框架 NETFramework Version v5 0 的参考程序集 要解决此问题 请安装此框架版本的 SDK 或 Targ
  • 没有模型 yii2 的 ActiveForm

    我想创建ActiveForm没有模型以防万一 我确实尝试过dynamicModel但我遇到了一些错误 use yii base DynamicModel model DynamicModel validateData compact KOM
  • 比较法语字符 Î 时出现问题

    当比较 le 和 Ile 时 C 并不认为它们是相同的 string Equals le Ile StringComparison InvariantCultureIgnoreCase 对于所有其他带重音的字符 我发现比较效果很好 我还应该
  • 如何在生产模式下启动延迟作业工人

    我正在关注Railscast 延迟作业 http railscasts com episodes 171 delayed job 一切在我的机器上运行得很好 如何在生产模式下启动delayed job工人 我在用延迟工作宝石 2 1 4 h
  • 有没有办法检查游戏对象是否已被破坏?

    我正在创建一个游戏 我想在玩家死亡时显示一个面板 我尝试过不同的方法 但似乎没有一个能达到我想要的效果 using System Collections Generic using UnityEngine using UnityEngine
  • 强制 InetAddress.getHostAddress() 返回 IPv4 地址

    我正在使用一个使用的库java net InetAddress getLocalHost getHostAddress 获取我的本地IP地址 然而 这总是在我的计算机上返回 IPv6 地址 Gentoo Linux JDK 1 6 0 37
  • IOS 中选择器作为参数

    我想为每个创建的按钮提出不同的方法 我尝试在 viewDidLoad 中调用 FirstImage 方法 但它不起作用 我在 ViewDidLoad 中的选择器有问题 无法识别 FirstImage 这是一个没有参数的 void 方法 视图
  • googletrans 停止工作,出现错误“NoneType”对象没有属性“group”

    我正在尝试googletrans而且效果很好 从今天早上开始 我开始出现以下错误 我浏览了 stackoverflow 和其他网站的多篇帖子 发现我的 IP 可能被禁止使用该服务一段时间 我尝试使用具有不同 IP 的多个服务提供商互联网 但
  • Google Play 发布前报告 - 资源名称

    我应该如何提供 EditText 的 id 来填充 Google Play 上的预发布报告 应用程序的 Beta Alpha 版本 的凭据 我试过 id editTextLogin editTextLogin R id editTextLo
  • 在 Webcontrol 上使用“Using”块有什么问题?

    我有以下使用 using 阻止TableHeaderCell LiteralControl HyperLink and GridViewRow try finally 该代码按缩进方式工作 使用 使用 块处理控件是否存在任何问题 陷阱 如下
  • Django 文件上传

    这是视图中的代码 def index request if request method POST a request POST logging debug a title logging debug a file form UploadF
  • 如何在 Magento 中获取完整的产品图片 url

    如何获取完整的产品图片 urlmagento 我需要将数据从magento迁移到django所以我需要得到产品完整图像网址迁移站点 这是我的代码
  • Android L——在视图上播放波纹效果

    我试图在某个时间在视图上 而不是在被触摸的视图上 发挥连锁反应 来自 Android L 具体来说 当用户成功更改某些文本时 我希望某个视图播放绿色波纹效果以显示成功 有什么办法可以做到这一点吗 我尝试将 RippleDrawable 放入
  • Visual Studio 诊断工具 - 如何更改选定的进程?

    我在用着Diagnostic Tools在 Visual Studio 2015 中调试 SharePoint Web 部件 我依附于一些w3wp exe处理并且窗口显示以下消息 Multiple processes are being d
  • 在 Visual Studio 中创建一个新的 TypeScript 项目

    如何开始在 Visual Studio 中编写 TypeScript 项目 当我创建一个新项目时没有这个选项 我安装了 Visual Studio 2012 以及 TypeScript 插件 我刚刚找到了解决方案 手动安装 VS Exten
  • D3D11CreateDevice() 返回垃圾值并失败

    我刚刚开始用这本书学习直接3D使用 DirectX11 进行 3D 游戏编程 我按照第一个教程进行操作 并收到一个消息框 显示 D3D11CreateDevice Failed 我检查了这个函数的返回值 得到了垃圾值 2005270483