#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-е, и они хотят вернуть свой код!