我目前正致力于在着色器反射代码中实现动态着色器链接。它工作得非常好,但为了使我的代码尽可能动态,我想自动化将偏移量放入dynamicLinkageArray的过程。微软在他们的样本中提出了类似的建议:
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);
我想在没有给出确切名称的情况下这样做,所以当着色器更改时,我不必手动更改此代码。为了实现这一点,我需要通过着色器反射得到我在下面标记的名称。这可能吗?我搜索了Shader-Reflection的引用,但除了接口槽的数量(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);
}
如果无法做到这一点,怎么会这样呢?只需添加我能想到的任何东西,以便我必须尽可能少地手动更改?
提前致谢