我有一个小应用程序,可以加载模型并在没有光照或任何东西的情况下显示它。我一直在尝试构建一个版本并在另一台计算机上运行它,但D3DX10CreateEffectFromFile一直在返回E_FAIL。
效果文件完美编译并在我的开发机器上完美运行,但在其他PC上则无法运行。电脑的规格不同。两者都是Windows7,都有GeForce显卡。唯一真正的区别是我试图运行该版本的计算机有一个兼容DirectX 11的显卡。
d3dx10_43.dll
ModelViewer.exe
Simple.fx
test.txt(模型文件)
这在我的开发机器上运行得非常好(我已经注释掉了大部分代码,所以我所做的只是打开一个窗口,initD3D10并尝试加载一个效果)。在另一台PC上它一切正常,直到...
ID3D10Blob* l_pBlob_Errors = NULL;
HRESULT hr = D3DX10CreateEffectFromFile(L"Simple.fx",
NULL,
NULL,
"fx_4_0",
//D3D10_SHADER_ENABLE_STRICTNESS || D3D10_SHADER_WARNINGS_ARE_ERRORS,
0,
0,
pD3DDevice,
NULL,
NULL,
&modelObject->pEffect,
&l_pBlob_Errors ,
NULL);
if (FAILED(hr))
{
LPVOID l_pError = NULL;
if( l_pBlob_Errors )
{
l_pError = l_pBlob_Errors->GetBufferPointer();
char* myChar = (char*)l_pError;
MessageBoxA(0, myChar, 0,0);
}
else
{
MessageBox(0,0,0,0);
}
return false;
}
我不认为的着色器包含任何错误,因为它在我的开发PC上正确编译
matrix Projection;
// PS_INPUT - input variables to the pixel shader
// This struct is created and fill in by the
// vertex shader
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float4 Color : COLOR0;
};
PS_INPUT VS(float4 Pos : POSITION, float4 Color : COLOR)
{
PS_INPUT psInput;
// Pass through both the position and the color
psInput.Pos = mul( Pos, Projection );
psInput.Color = Color;
return psInput;
}
float4 PS(PS_INPUT psInput) : SV_Target
{
return psInput.Color;
}
// Define the technique
technique10 Render
{
pass P0
{
SetVertexShader( CompileShader( vs_4_0, VS() ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_4_0, PS() ) );
}
}
L“simple.fx”也是正确的文件路径,因为我可以使用std :: ifstream来读取它。我已经搜索了几个小时并且无法找到答案,所有相关问题都证明是效果文件中的一个错误,它在我的开发机器上编译。
当我向Effect文件添加错误并在我的开发机器上运行时,错误会显示在消息框中。当我在我的其他电脑上运行相同的错误代码时,没有打印错误,并且l_pBlob_Errors == 0
它可能是一些非常简单的东西,但我只是不明白发生了什么。任何帮助将不胜感激
答案 0 :(得分:0)
问题的根本原因是您依赖 d3dx10_43.dll和d3dcompile_43.dll。 D3DX10开始使用D3DCompile,而不是在DirectX SDK(2007年4月)发行版中使用另一个HLSL编译器副本。请参阅此post和此post。
请记住,许可证不允许您将D3DX10 * .DLL或D3DCompiler#43与您的应用程序并排复制。您必须使用传统的DirectSetup REDIST。您还应该使用refreshed version而不是DirectX SDK附带的(2010年6月)。
当然,更好的解决方案是放弃Direct3D 10,转移到Direct3D 11,并完全避免使用legacy DirectX SDK ...另外,许可证允许您复制D3DCompile#46或#47与您的申请并排。