Directx D3DX10CreateEffectFromFile出现问题

Directx D3DX10CreateEffectFromFile出现问题,directx,directx-10,Directx,Directx 10,我在加载效果文件时遇到问题。我对D3DX10CreateEffectFromFile()的调用以S_OK的形式传递,但传递给它的ID3D10Effect*在函数调用后保持为null。这是我的源代码(我一直在调试,所以有些东西被注释掉了,但是相关的代码仍然在执行) 复制/粘贴有点损坏了空格,对不起!提前感谢您的帮助!这一次让我准备将visual studio刻录到光盘上,这样我就可以将其扔出窗口…您应该为Direct3D 10设备启用调试,然后查找任何相关输出 此外,您应该检查所有HRESULT值

我在加载效果文件时遇到问题。我对D3DX10CreateEffectFromFile()的调用以S_OK的形式传递,但传递给它的ID3D10Effect*在函数调用后保持为null。这是我的源代码(我一直在调试,所以有些东西被注释掉了,但是相关的代码仍然在执行)


复制/粘贴有点损坏了空格,对不起!提前感谢您的帮助!这一次让我准备将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;
        }
    }  
}