You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DirectX12中Model->LoadTextures报错80004002,提示未调用CoInitialize

DirectX12加载模型纹理报错问题排查

问题描述

基于DirectX官方示例HelloTriangle修改,尝试用DirectX12渲染模型,已按照《Rendering a model》文档将.obj、.mtl、.jpg资源转换为.sdkmesh格式。

调用代码如下:

m_model = Model::CreateFromSDKMESH(m_device.Get(), GetAssetFullPath(L"cup.sdkmesh").c_str());

m_modelResources = m_model->LoadTextures(m_device.Get(), resourceUpload,
            GetAssetFullPath(L"").c_str());

调用LoadTextures时出现错误,追踪源码发现错误来自EffectTextureFactory.cpp中的CreateWICTextureFromFileEx函数,错误日志:

onecore\com\combase\objact\objact.cxx(800)\combase.dll!00007FF8518976C5: (caller: 00007FF8518969D2) ReturnHr(1) tid(1ad0) 800401F0 尚未调用 CoInitialize。
ERROR: CreateWICTextureFromFile failed (80004002) for 'D:\D3D12HelloWorld\src\HelloTriangle\bin\x64\Debug\cup.jpg'
Exception thrown at 0x00007FF8509B4B2C in D3D12HelloTriangle.exe: Microsoft C++ exception: std::runtime_error at memory location 0x00000089456FDEE8.
Unhandled exception at 0x00007FF8509B4B2C in D3D12HelloTriangle.exe: Microsoft C++ exception: std::runtime_error at memory location 0x00000089456FDEE8.

Assertion failed!

Program: ...HelloTriangle\bin\x64\Debug\D3D12HelloTriangle.exe
File: D:\a\_work\1\s\Src\EffectTextureFactory.cpp
Line: 194

Expression: textureEntry.mResource != nullptr

已确认纹理文件路径正确,请问问题出在哪里?是否缺少初始化步骤?

附D3D12HelloTriangle.cpp中LoadAssets函数的修改代码:

// Define the geometry for a triangle.
//Vertex triangleVertices[] =
//{
//  { { 0.0f, 0.25f * m_aspectRatio, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } },
//  { { 0.25f, -0.25f * m_aspectRatio, 0.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
//  { { -0.25f, -0.25f * m_aspectRatio, 0.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } }
//};

//const UINT vertexBufferSize = sizeof(triangleVertices);

m_graphicsMemory = std::make_unique<GraphicsMemory>(m_device.Get());
m_state = std::make_unique<CommonStates>(m_device.Get());
m_model = Model::CreateFromSDKMESH(m_device.Get(), GetAssetFullPath(L"cup.sdkmesh").c_str());
ResourceUploadBatch resourceUpload(m_device.Get());
resourceUpload.Begin();

m_modelResources = m_model->LoadTextures(m_device.Get(), resourceUpload,
    GetAssetFullPath(L"").c_str());
m_fxFactory = std::make_unique<EffectFactory>(m_modelResources->Heap(), m_state->Heap());

auto uploadResourceFinished = resourceUpload.End(m_commandQueue.Get());
uploadResourceFinished.wait();

RenderTargetState rtState(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_D32_FLOAT);
EffectPipelineStateDescription pd(nullptr, CommonStates::Opaque, CommonStates::DepthDefault, CommonStates::CullClockwise, rtState);
m_modelNormal = m_model->CreateEffects(*m_fxFactory, pd, pd);

问题原因与解决方法

  • 核心原因:错误日志明确提示尚未调用 CoInitialize,加载纹理用到的WIC(Windows成像组件)基于COM技术实现,而COM库必须在使用前完成初始化。官方HelloTriangle示例未涉及COM组件调用,因此缺少这一步初始化。

  • 解决步骤:

    1. 在程序入口(如WinMain或main函数)最开始位置添加COM初始化代码:
      HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
      if (FAILED(hr))
      {
          // 处理初始化失败逻辑,如弹窗提示或退出程序
          return -1;
      }
      
      单线程场景可使用COINIT_APARTMENTTHREADED,但推荐COINIT_MULTITHREADED适配多线程需求。
    2. 程序退出前调用CoUninitialize()释放COM资源:
      CoUninitialize();
      
  • 补充说明:
    完成COM初始化后,CreateWICTextureFromFileEx就能正常创建WIC对象加载纹理,后续的断言错误也会随之解决。

内容的提问来源于stack exchange,提问作者youngh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:35:58