2009-07-13 6 views
2

Je crée un effet en utilisantComment obtenir toutes les constantes de shader (uniformes) d'un ID3DXEffect?

hr = D3DXCreateEffectFromFile(g_D3D_Device, 
     shaderPath.c_str(), 
     macros, 
     NULL, 
     0, 
     NULL, 
     &pEffect, 
     &pBufferErrors); 

Je voudrais obtenir tous les uniformes que ce shader utilise. En OpenGL, j'ai utilisé glGetActiveUniform et glGetUniformLocation pour obtenir la taille, le type, le nom de la constante, etc. Existe-t-il une fonction équivalente D3DX9?

Répondre

2
D3DXHANDLE handle = m_pEffect->GetParameterByName(NULL, "Uniform Name"); 
if (handle != NULL) 
{ 
    D3DXPARAMETER_DESC desc; 
    if (SUCCEEDED(m_pEffect->GetParameterDesc(handle, &desc))) 
    { 
     // You now have pretty much all the details about the parameter there are in "desc". 
    } 
} 

Vous pouvez également parcourir chaque paramètre en procédant comme suit:

UINT index = 0; 
while(1) 
{ 
    D3DXHANDLE handle = m_pEffect->GetParameter(NULL, index); 
    if (handle == NULL) 
     break; 

    // Get parameter desc as above. 
    index++; 
} 
1

En utilisant

m_pEffect-> GetParameter (NULL, index);

pendant que (1) le cycle se traduira par

D3DX: ID3DXEffect :: GetParameter: index non valide

avertissement

. Donc, nous pouvons utiliser la structure D3DXEFFECT_DESC pour trouver le nombre de paramètres d'un effet.

Quelque chose comme ceci:

D3DXEFFECT_DESC fx_desc; 
g_pEffect->GetDesc(&fx_desc); 

for (UINT index=0;index<=fx_desc.Parameters;index++) 
{ 
    D3DXHANDLE handle = g_pEffect->GetParameter(NULL, index); 
    if (handle == NULL) 
     break; 

    D3DXPARAMETER_DESC param_desc; 
    if (S_OK == (g_pEffect->GetParameterDesc(handle, &param_desc))) 
    { 
     //check the details about the parameter in param_desc 
    } 
} 
Questions connexes