Возможно ли получить имя интерфейса (динамическая связь шейдеров)?

#directx #shader #hlsl

#directx #шейдер #hlsl

Вопрос:

В настоящее время я работаю над внедрением динамической связи шейдеров в свой код отражения шейдеров. Это работает довольно хорошо, но чтобы сделать мой код максимально динамичным, я хотел бы автоматизировать процесс получения смещения в dynamicLinkageArray. Microsoft предлагает что-то подобное в своем примере:

 g_iNumPSInterfaces = pReflector->GetNumInterfaceSlots(); 
g_dynamicLinkageArray = (ID3D11ClassInstance**) malloc( sizeof(ID3D11ClassInstance*) * g_iNumPSInterfaces );
if ( !g_dynamicLinkageArray )
    return E_FAIL;

ID3D11ShaderReflectionVariable* pAmbientLightingVar = pReflector->GetVariableByName("g_abstractAmbientLighting");
g_iAmbientLightingOffset = pAmbientLightingVar->GetInterfaceSlot(0);
 

Я хотел бы сделать это, не указывая точного имени, поэтому при изменении шейдера мне не нужно вручную изменять этот код. Для этого мне нужно было бы получить имя, которое я отметил ниже, с помощью отражения шейдеров. Возможно ли это? Я просмотрел ссылки на отражение шейдера, но не нашел ничего полезного, кроме количества интерфейсных слотов ( GetNumInterfaceSlots() ).

 #include "BasicShader_PSBuffers.hlsli"

iBaseLight     g_abstractAmbientLighting;
               ^^^^^^^^^^^^^^^^^^^^^^^^^^

struct PixelInput
{
    float4 position : SV_POSITION;
    float3 normals : NORMAL;
    float2 tex: TEXCOORD0;
};

float4 main(PixelInput input) : SV_TARGET
{
    float3 Ambient = (float3)0.0f;
    Ambient = g_txDiffuse.Sample(g_samplerLin, input.tex) * g_abstractAmbientLighting.IlluminateAmbient(input.normals);

    return float4(saturate(Ambient), 1.0f);
}
 

Если это невозможно, как можно это сделать? Просто добавьте туда все, что я могу придумать, чтобы мне приходилось как можно меньше менять вручную?

Заранее спасибо

Комментарии:

1. Вместо этого вы можете выполнить итерацию по всем переменным, используя GetVariableByIndex, а затем использовать GetDesc для ID3D11ShaderReflectionVariable для получения имени / смещений…

2. Святой Иевус, я поражен, что они все еще создают образцы C , которые вызывают malloc. Привет, звонили 1980-е, и они хотят вернуть свой код!