搭载CX/C++ Runtime的UWP应用调用D3DCompile返回E_INVALIDARG问题
排查D3DCompile返回E_INVALIDARG的问题
让我们一步步拆解你遇到的问题,先从最显眼的语法疏漏开始:
1. HLSL结构体语法错误
你提供的像素着色器代码里,PixelShaderInput结构体定义的末尾缺少分号——HLSL要求结构体定义必须以分号结尾,这是常见的语法错误,会直接导致编译失败返回E_INVALIDARG。修正后的代码如下:
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" "}";
2. 验证字符串长度参数
D3DCompile的第二个参数是源数据的字节数,std::string::length()返回的是字符数(不包含末尾的\0终止符)。虽然多数情况下D3DCompiler能处理这种情况,但为了稳妥,建议传递shaderSource.size() + 1,确保编译器能正确识别字符串的结束位置:
HRESULT hr = D3DCompile( shaderSource.c_str(), shaderSource.size() + 1, NULL, NULL, NULL, "main", "ps_5_0", NULL, NULL, &pShaderCode, &errorBlob);
3. 利用errorBlob获取详细错误信息
你已经传入了&errorBlob,这是排查编译问题的关键!调用失败后一定要检查这个对象,它会返回具体的编译错误描述,比如语法位置、错误类型等。可以用这段代码提取错误信息:
if (errorBlob != nullptr) { const char* errorMsg = static_cast<char*>(errorBlob->GetBufferPointer()); size_t errorSize = errorBlob->GetBufferSize(); // 这里可以输出errorMsg到调试窗口或者日志,比如用OutputDebugStringA errorBlob->Release(); }
哪怕修正了结构体的问题,后续如果还有错误,这个信息能帮你快速定位根源。
4. UWP环境的额外检查
在UWP项目中,还要确认几个配置细节:
- 确保项目已链接
D3DCompiler.lib(在链接器输入里添加),并且包含了<d3dcompiler.h>头文件 - 确认你的Windows SDK版本与使用的D3DCompiler版本匹配(比如Windows 10 SDK对应D3DCompiler_47.dll及以上)
先从修正结构体分号开始,再结合errorBlob的错误信息,应该能快速解决这个E_INVALIDARG问题。
内容的提问来源于stack exchange,提问作者Eugeny
相关产品推荐
相关产品推荐

