2009-07-13 31 views
2

我創建使用如何從ID3DXEffect獲取所有着色器常量(制服)?

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

我想獲得這個着色器使用的所有制服的效果。在OpenGL中,我使用glGetActiveUniform和glGetUniformLocation來獲取常量的大小,類型,名稱等。是否有D3DX9等效函數?

回答

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

可以通過每個參數通過執行迭代也下列:

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

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

使用

m_pEffect->的getParameter(NULL,索引);

在一段時間(1)循環將導致

D3DX:ID3DXEffect ::的getParameter:無效索引

警告。

因此,我們可以使用D3DXEFFECT_DESC結構來查找Effect有多少個參數。

事情是這樣的:

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