DirectX11 E_INVALIDARG一个或多个参数无效

时间:2016-02-12 08:54:04

标签: hlsl direct3d11

当我尝试从内存加载Shader结果时,编译器会说:一个或多个参数无效。着色器编译成功,但似乎在内存中的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

1 个答案:

答案 0 :(得分:0)

效果为Direct3D 11的legacy DirectX SDK版本仅包含private void getImage() { using (MySqlConnection conn = new MySqlConnection(connectionManager.connectionString)) { try { conn.Open(); string query = "SELECT Image FROM student_img WHERE ID = @ID"; MySqlCommand cmd = new MySqlCommand(query, conn); int id = 10; cmd.Parameters.AddWithValue("@ID", id); var da = new MySqlDataAdapter(cmd); var ds = new DataSet(); da.Fill(ds, "Image"); int count = ds.Tables["Image"].Rows.Count; if (count > 0) { var data = (Byte[])(ds.Tables["Image"].Rows[count - 1]["Image"]); var stream = new MemoryStream(data); picLogo.Image = Image.FromStream(stream); } } catch (Exception ex) { MessageBox.Show("Connection Error!\n" + ex.Message, "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } ,用于创建需要使用应用程序加载的已编译着色器二进制blob的效果。

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

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

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

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

使用fx代替尝试手动进行,因为原始海报尝试过这是最简单的解决方案。

  

原始库希望强烈建议使用构建时而不是运行时的效果编译。鉴于今天效果11的主要用途是开发人员教育,这对新开发人员来说是不必要的,因此GitHub版本现在包含了创建效果的所有四种可能选项。

注意:不推荐使用HLSL编译器中的D3DX11CompileEffectFromFile配置文件,并且需要使用效果11。