当我尝试从内存加载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
答案 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。