Trouble with D3DX10CreateEffectFromFile

199 Views Asked by At

I've been having a problem loading an effect file. My call to D3DX10CreateEffectFromFile() passes with S_OK, but the ID3D10Effect* I pass into it remains null after the function call. Here is my source (I've been debugging, so there's stuff commented out, but the relevant code is still executing).

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;
        }
    }  
}

The copy/paste mangled the whitespace a bit, sorry! Thanks in advance for any help! This one has me about ready to burn visual studio to a disc just so I can throw it out the window...

1

There are 1 best solutions below

0
On

You should enable debugging for your Direct3D 10 device and then look for any relevant output.

Also, you should be checking all HRESULT values for failure...

Note that if you moved to Direct3D 11, you would have full source to Effects 11 as it's on CodePlex and not part of the OS.