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组件调用,因此缺少这一步初始化。解决步骤:
- 在程序入口(如
WinMain或main函数)最开始位置添加COM初始化代码:
单线程场景可使用HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); if (FAILED(hr)) { // 处理初始化失败逻辑,如弹窗提示或退出程序 return -1; }COINIT_APARTMENTTHREADED,但推荐COINIT_MULTITHREADED适配多线程需求。 - 程序退出前调用
CoUninitialize()释放COM资源:CoUninitialize();
- 在程序入口(如
补充说明:
完成COM初始化后,CreateWICTextureFromFileEx就能正常创建WIC对象加载纹理,后续的断言错误也会随之解决。
内容的提问来源于stack exchange,提问作者youngh
相关产品推荐
相关产品推荐

