如何从ID3DXEffect获取所有着色器常量(制服)?

时间:2009-07-13 21:32:51

标签: c++ graphics 3d directx

我正在使用

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

我想得到这个着色器正在使用的所有制服。在OpenGL中,我使用glGetActiveUniform和glGetUniformLocation来获取常量的大小,类型,名称等。是否有D3DX9等效函数?

2 个答案:

答案 0 :(得分: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 :(得分:1)

使用

  

m_pEffect-> GetParameter(NULL,index);

in while(1)循环将导致

  

D3DX:ID3DXEffect :: GetParameter:索引无效

警告。

因此我们可以使用D3DXEFFECT_DESC结构来查找效果有多少参数。

这样的事情:

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