Directx D3DX10CreateEffectFromFile出现问题
我在加载效果文件时遇到问题。我对D3DX10CreateEffectFromFile()的调用以S_OK的形式传递,但传递给它的ID3D10Effect*在函数调用后保持为null。这是我的源代码(我一直在调试,所以有些东西被注释掉了,但是相关的代码仍然在执行)Directx D3DX10CreateEffectFromFile出现问题,directx,directx-10,Directx,Directx 10,我在加载效果文件时遇到问题。我对D3DX10CreateEffectFromFile()的调用以S_OK的形式传递,但传递给它的ID3D10Effect*在函数调用后保持为null。这是我的源代码(我一直在调试,所以有些东西被注释掉了,但是相关的代码仍然在执行) 复制/粘贴有点损坏了空格,对不起!提前感谢您的帮助!这一次让我准备将visual studio刻录到光盘上,这样我就可以将其扔出窗口…您应该为Direct3D 10设备启用调试,然后查找任何相关输出 此外,您应该检查所有HRESULT值
复制/粘贴有点损坏了空格,对不起!提前感谢您的帮助!这一次让我准备将visual studio刻录到光盘上,这样我就可以将其扔出窗口…您应该为Direct3D 10设备启用调试,然后查找任何相关输出 此外,您应该检查所有HRESULT值是否存在故障
请注意,如果您移动到Direct3D 11,您将拥有Effects 11的完整源代码,因为它已打开,而不是操作系统的一部分。Visual Studio的输出窗口中是否有任何消息?调试器会在调用此函数的函数中点击一个断点。当我尝试引用effect指针时,由于尝试引用空指针而导致错误。真正奇怪的是,这个函数运行得很好;您可能认为它会在调用GetPassByIndex()时中断,但不会。当尝试将着色器变量分配给指针时,它会在调用函数中中断。我插入了全局“hResult”,以便在调试器到达断点时检查“r”的值,它的值为S_OK,但m_pcureeffect等都有空值。当然,函数也无法设置我的输入布局,因为对GetDesc()的调用依赖于恰好为null的指针。我不确定这是否应该引发异常,我最好检查一下,但无论如何都不会。真的吗?strage,你能提供整个项目吗?当然可以。不过它更大。你有我可以发送的电子邮件吗?
HRESULT hResult;
void fxMgr::LoadEffectFile( char* fxFileName,
char* techniqueName,
ID3D10Effect* pEffect,
dgInputLayoutType layoutType)
{
/*if (L"fx"!=GetFileExtension(fxFileName))
{
pEffect=NULL;
throw dgGameError(L"Could not load specified shader!");
return;
}
*/
if (NULL==fxFileName)
{
pEffect=NULL;
m_pCurEffect=NULL;
m_pCurEffectTechnique=NULL;
m_pCurPass=NULL;
}
return;
HRESULT r = 0;
DWORD shaderFlags = 0;//D3D10_SHADER_ENABLE_STRICTNESS;
/* #if defined( DEBUG ) || defined( _DEBUG )
// Turn on extra debug info when in debug config
shaderFlags |= D3D10_SHADER_DEBUG;
#endif
*/
ID3D10Blob* pErrors = NULL;
// Create the effect
r = D3DX10CreateEffectFromFileA(fxFileName , NULL, NULL, "fx_4_0", shaderFlags, 0,
Graphics()->GetDevice(), NULL, NULL, &pEffect, &pErrors, NULL);
if(pErrors)
{
//MessageBoxA(0, (char*)pErrors->GetBufferPointer(),0, 0);
SafeRelease(pErrors);
}
hResult=r;
/*if(FAILED(r))
{
pEffect=NULL;
return;
}*/
m_pCurEffect=pEffect;
m_pCurEffectTechnique=pEffect->GetTechniqueByName(techniqueName);
m_pCurPass=m_pCurEffectTechnique->GetPassByIndex(0);
if (layoutArray[layoutType]==NULL)
{
D3D10_PASS_DESC descPass;
m_pCurPass->GetDesc(&descPass);
switch(layoutType)
{
case LAYOUT_POS_NORMAL_TEX:
if(1)
{
D3D10_INPUT_ELEMENT_DESC layout[]=
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D10_APPEND_ALIGNED_ELEMENT, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D10_APPEND_ALIGNED_ELEMENT,D3D10_INPUT_PER_VERTEX_DATA, 0}
};
UINT uiNumElements = sizeof(layout)/sizeof(layout[0]);
Graphics()->GetDevice()->CreateInputLayout( layout, uiNumElements, descPass.pIAInputSignature,
descPass.IAInputSignatureSize, &PosNormalTex);
}
break;
case LAYOUT_POS_TAN_NORMAL_TEX:
if (1)
{
D3D10_INPUT_ELEMENT_DESC layout[]=
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D10_APPEND_ALIGNED_ELEMENT, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D10_APPEND_ALIGNED_ELEMENT, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D10_APPEND_ALIGNED_ELEMENT,D3D10_INPUT_PER_VERTEX_DATA, 0}
};
UINT uiNumElements = sizeof(layout)/sizeof(layout[0]);
Graphics()->GetDevice()->CreateInputLayout( layout, uiNumElements, descPass.pIAInputSignature,
descPass.IAInputSignatureSize, &PosTanNormalTex);
}
break;
case LAYOUT_POS:
if (1)
{
D3D10_INPUT_ELEMENT_DESC layout[]=
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0}
};
UINT uiNumElements = sizeof(layout)/sizeof(layout[0]);
Graphics()->GetDevice()->CreateInputLayout( layout, uiNumElements, descPass.pIAInputSignature,
descPass.IAInputSignatureSize, &Pos);
}
break;
case LAYOUT_IGNORE:
break;
default:
throw dgGameError(L"Invalid input layout type specified: cannot properly load shader!");
break;
}
}
}