DirectX11 E_INVALIDARG 一个或多个参数无效

DirectX11 E_INVALIDARG One or more arguments are invalid

当我尝试从内存加载着色器结果时,编译器提示:一个或多个参数无效。着色器编译成功,但在内存中的 D3DCompileFromFile() 命令之后似乎不正确,并且 ID3DBlob 接口由于某种原因没有获得正确的值。

ID3DBlob*  pBlobFX = NULL;
ID3DBlob*  pErrorBlob = NULL;
hr = D3DCompileFromFile(str, NULL, NULL, NULL, "fx_5_0", NULL, NULL,  &pBlobFX, &pErrorBlob);  //  OK
if (FAILED(hr))
{
    if (pErrorBlob != NULL)
        OutputDebugStringA((char *)pErrorBlob->GetBufferPointer());
    SAFE_RELEASE(pErrorBlob);
    return hr;
}

//  Create the  effect
hr = D3DX11CreateEffectFromMemory(pBlobFX->GetBufferPointer(), pBlobFX->GetBufferSize(), 0, pd3dDevice, ppEffect); //  Error:  E_INVALIDARG One or more arguments are invalid

legacy DirectX SDK 版本的 Direct3D 11 效果仅包含 D3DX11CreateEffectFromMemory 用于创建需要使用由应用程序加载的已编译着色器二进制 blob 的效果。

最新的 GitHub 版本包括其他预期功能:

  • D3DX11CreateEffectFromFile 从磁盘加载编译后的二进制 blob,然后从中创建效果。

  • D3DX11CompileEffectFromMemory 使用 D3DCompile API 编译内存中的 fx 文件,然后从中创建效果。

  • D3DX11CompileEffectFromFile 使用 D3DCompile API 编译提供的 fx 文件,然后从中创建效果。

使用 D3DX11CompileEffectFromFile 而不是像原始发帖者那样尝试手动执行是这里最简单的解决方案。

The original library wanted to strongly encourage using build-time rather than run-time compilation of effects. Given that the primary use of Effects 11 today is developer education, this was unnecessarily difficult for new developers to use so the GitHub version now includes all four possible options for creating effects.

注意:HLSL 编译器中的 fx_5_0 配置文件已弃用,需要使用 Effects 11。