2009-07-13 9 views
2

ich einen Effekt zu schaffenWie bekomme ich alle Shader-Konstanten (Uniformen) von einem ID3DXEffect?

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

mit würde ich alle Uniformen bekommen, die diese Shader verwendet wird. In OpenGL habe ich glGetActiveUniform und glGetUniformLocation verwendet, um die Größe, den Typ, den Namen etc. zu erhalten. Gibt es eine D3DX9-äquivalente Funktion?

Antwort

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". 
    } 
} 

Sie können auch, indem Sie die folgenden durch die einzelnen Parameter durchlaufen:

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

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

Mit

m_pEffect-> GetParameter (NULL, Index);

in while (1) Zyklus in

D3DX Folge: ID3DXEffect :: GetParameter: ungültiger Index

Warnung.

So können wir die D3DXEFFECT_DESC-Struktur verwenden, um zu ermitteln, wie viele Parameter ein Effekt hat.

Etwas wie folgt aus:

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 
    } 
} 
Verwandte Themen