У меня есть небольшое приложение, которое загружает модель и отображает ее без освещения или чего-либо еще. Я пытался создать релиз и запустить его на другом компьютере, но D3DX10CreateEffectFromFile продолжает возвращать E_FAIL.
Файл Effect отлично компилируется и отлично работает на моей машине для разработки, но не на другом ПК. Спецификации ПК не так уж и отличаются. Оба Windows7, оба имеют видеокарты GeForce. Единственное реальное отличие состоит в том, что компьютер, на котором я пытаюсь запустить релиз, имеет совместимую с DirectX 11 видеокарту.
d3dx10_43.dll
ModelViewer.exe
Simple.fx
test.txt (файл модели)
Это прекрасно работает на моей машине для разработки (я закомментировал большую часть кода, так что все, что я делаю, это открываю окно, initD3D10 и пытаюсь загрузить эффект). На другом ПК все работает нормально до …
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;
}
Я не думаю, что шейдер содержит какие-либо ошибки, потому что он правильно компилируется на моем компьютере разработчика
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, который компилируется прямо на моем компьютере разработчика.
Когда я добавляю ошибку в файл Effect и запускаю ее на своем компьютере разработчика, эта ошибка отображается в окне сообщения. Когда я запускаю тот же код с ошибками на моем другом компьютере, ошибка не выводится и l_pBlob_Errors == 0
Вероятно, что-то действительно нуб и легко, но я просто не понимаю, что происходит. Любая помощь будет принята с благодарностью
Основная причина вашей проблемы в том, что вы полагаетесь на и то и другое d3dx10_43.dll и d3dcompile_43.dll. D3DX10 начал использовать D3DCompile вместо того, чтобы иметь еще одну копию компилятора HLSL в выпуске DirectX SDK (апрель 2007). Видеть это сообщение и это сообщение.
Помните также, что по лицензии вы не можете просто копировать D3DX10 * .DLL или D3DCompiler # 43 рядом с вашим приложением. Вы должны использовать устаревший DirectSetup REDIST. Вы также должны использовать обновленная версия а не тот, который шел с DirectX SDK (июнь 2010).
Конечно, лучшим решением будет просто отказаться от Direct3D 10, перейти на Direct3D 11 и избегать использования устаревший DirectX SDK полностью … Плюс, вам разрешено по лицензии просто копировать D3DCompile # 46 или # 47 рядом с вашим приложением.
Других решений пока нет …