是否可以获取接口名称(Dynamic Shader Linkage)?

时间:2014-06-22 13:22:09

标签: directx shader hlsl

我目前正致力于在着色器反射代码中实现动态着色器链接。它工作得非常好,但为了使我的代码尽可能动态,我想自动化将偏移量放入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);
}

如果无法做到这一点,怎么会这样呢?只需添加我能想到的任何东西,以便我必须尽可能少地手动更改?

提前致谢

0 个答案:

没有答案