D3D11开发3D游戏引擎报fx_4_0_level_9_3着色器模型不支持错误
错误原因
你代码中显式传入D3DCompileFromFile的着色器模型为vs_5_0/ps_5_0,但抛出Unsupported shader model specified "fx_4_0_level_9_3"错误,核心诱因有两点:
- 你的
shader.fx文件内写了#pragma target fx_4_0_level_9_3这类编译目标指令,shader内部的pragma指令优先级高于API调用传入的参数,会直接覆盖你代码里指定的SM5.0配置。而fx_*前缀的profile是给已废弃的legacy D3DX Effects框架用的,新版d3dcompiler(47及之后版本)已经完全移除了对这类旧profile的支持,直接触发报错。 - 项目链接了过老版本的
d3dcompiler.dll(如d3dcompiler_43及更早版本),这类老版本编译器不支持你指定的SM5.0目标,会自动回退到旧的FX 9.3 profile,同样会触发兼容错误。
修复方案
- 打开
shader.fx源文件,删除所有#pragma target fx_*、#pragma effect类的旧Effects框架相关指令。如果需要在shader内指定编译目标,顶点着色器入口对应写#pragma target vs_5_0,像素着色器入口对应写#pragma target ps_5_0即可,不要使用fx开头的profile标识。 - 检查项目链接配置,确保链接的
d3dcompiler.lib对应系统自带的d3dcompiler_47.dll,这是支持SM5.0的稳定正式版本,不要使用多年前的旧版d3dcompiler依赖。 - 补全当前代码缺失的HRESULT判断、错误输出和资源释放逻辑,否则后续编译出其他问题时你拿不到具体错误日志,还会出现内存泄漏。补全后的参考实现:
bool GraphicsEngine::createShaders() { ID3DBlob* errblob = nullptr; HRESULT hr = D3DCompileFromFile(L"shader.fx", nullptr, nullptr, "vsmain", "vs_5_0", 0, 0, &m_vsblob, &errblob); if (FAILED(hr)) { if (errblob) { OutputDebugStringA((const char*)errblob->GetBufferPointer()); errblob->Release(); } return false; } hr = D3DCompileFromFile(L"shader.fx", nullptr, nullptr, "psmain", "ps_5_0", 0, 0, &m_psblob, &errblob); if (FAILED(hr)) { if (errblob) { OutputDebugStringA((const char*)errblob->GetBufferPointer()); errblob->Release(); } m_vsblob->Release(); return false; } hr = m_d3d_device->CreateVertexShader(m_vsblob->GetBufferPointer(), m_vsblob->GetBufferSize(), nullptr, &m_vs); if (FAILED(hr)) { m_psblob->Release(); m_vsblob->Release(); return false; } hr = m_d3d_device->CreatePixelShader(m_psblob->GetBufferPointer(), m_psblob->GetBufferSize(), nullptr, &m_ps); if (FAILED(hr)) { m_vs->Release(); m_psblob->Release(); m_vsblob->Release(); return false; } if (errblob) errblob->Release(); return true; }
- 如果你需要兼容D3D9级别的低特性等级设备,不要使用
fx_4_0_level_9_3这类旧profile,直接使用标准着色器模型标识vs_4_0_level_9_3/ps_4_0_level_9_3即可。新开发自研引擎不建议再接入已废弃的D3DX Effects框架。
内容的提问来源于stack exchange,提问作者Segi GameHD
相关产品推荐
相关产品推荐

