2013-07-21 6 views
1

Я знаю, как отражать постоянные буферы, но как отражать текстуры? Вот мой шейдер:Отражая регистр текстуры из шейдера HLSL по имени

cbuffer buffer : register(b0) 
{ 
    column_major matrix viewProjectionMatrix; 
    column_major matrix modelMatrix; 
    float4 texScaleOffset; 
    float4 tint; 
} 

struct VS_INPUT 
{ 
    float4 Pos : POSITION; 
    float2 Tex : TEXCOORD0; 
}; 

struct PS_INPUT 
{ 
    float4 Pos : SV_POSITION; 
    float2 Tex : TEXCOORD0; 
}; 

PS_INPUT VS(VS_INPUT input) 
{ 
    PS_INPUT output = (PS_INPUT)0; 
    output.Pos = mul(viewProjectionMatrix, mul(modelMatrix, input.Pos)); 
    output.Tex = input.Tex * texScaleOffset.xy + texScaleOffset.zw; 

    return output; 
} 

Texture2D textureMap : register(t0); 
SamplerState SampleType : register(s0); 

float4 PS(PS_INPUT input) : SV_Target 
{ 
    return textureMap.Sample(SampleType, input.Tex); 
} 

Так как я запрос номер регистра textureMap от C++, если я знаю его имя («textureMap»)? Мой вариант использования - это механизм, который позволяет пользователям писать свои собственные шейдеры, поэтому я не могу кодировать любые значения.

ответ

2

В очень похожим образом, как вы отражают постоянные буферы:

ID3D11ShaderReflection* reflectionInterface; 
D3DReflect(bytecode, bytecodeLength, IID_ID3D11ShaderReflection, (void**)&reflectionInterface); 

D3D11_SHADER_INPUT_BIND_DESC bindDesc; 
reflectionInterface->GetResourceBindingDescByName("textureMap", &bindDesc); 

bindDesc.BindPoint является индексом слота текстура привязано.

Смежные вопросы