D3D 编译 E_INVALIDARG

D3DCompile E_INVALIDARG

我在使用 D3DCompile 时遇到了一些问题。我正在编写具有 CX\C++ 运行时的 UWP 应用程序。 有代码

    const std::string shaderSource =
        "struct PixelShaderInput\n"
        "{\n"
        "    float3 color : COLOR0;\n"
        "};\n\n"
        "float4 main(PixelShaderInput input) : SV_TARGET\n"
        "{\n"
        "    return float4(1.0f, 1.0f, 0.0f, 1.0f);\n"
        "}";


    HRESULT hr = D3DCompile(
        shaderSource.c_str(), 
        shaderSource.length(),
        NULL, 
        NULL, 
        NULL, 
        "main", 
        "ps_5_0", 
        NULL,
        NULL, 
        &pShaderCode, 
        &errorBlob);

结果,我得到 E_INVALIDARG。

有趣的是,如果我在着色器的文本中犯了一个错误(例如,没有写另一个入口点),那么结果就是特定的编译错误。

可能是什么问题?

是的,放弃旧的 SDK 就可以了!

不应将旧版 DirectX SDK 用于 UWP 应用程序开发。

MSDN: Where is the DirectX SDK? and this blog post

用于 Windows 8.0、Windows 8.1 和 Windows 10 的 Windows SDK 已经包含所有最新的 DirectX headers,包括最新版本的D3DCompile(版本 #47,与旧版 DirectX SDK 的版本 #43 相对)。参见 HLSL, FXC, and D3DCompile

一些旧版 DirectX SDK 已弃用,并且在 Windows SDK 中不可用,特别是 D3DX9、D3DX10 和 D3DX11。参见 Living without D3DX

Really, you shouldn't need the legacy DirectX SDK even for Win32 desktop development except when you are still targeting Windows XP -or- if you need XAudio2 on Windows 7. See The Zombie DirectX SDK.