Как получить все шейдерные константы (униформы) из ID3DXEffect? - PullRequest
2 голосов
/ 14 июля 2009

Я создаю эффект, используя

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

Я хотел бы получить все формы, которые использует этот шейдер. В OpenGL я использовал glGetActiveUniform и glGetUniformLocation, чтобы получить размер, тип, имя константы и т. Д. Есть ли эквивалентная функция D3DX9?

Ответы [ 2 ]

2 голосов
/ 14 июля 2009
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 голос
/ 23 января 2015

Использование

m_pEffect-> GetParameter (NULL, index);

в то время как (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
    }
}
...