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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:09:25