динамическая передача параметров шейдера direct3d - PullRequest
1 голос
/ 13 января 2012

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

Текущий код шейдера

char shaderCode[] = " \
sampler2D screen: register(s0); \
\
float offsetBrightness = 0.0f; \
float offsetContrast   = 0.9f; \
float4 PSBrightnessContrast(float2 inCoord : TEXCOORD0) : COLOR0\
{\
    return (tex2D(screen, inCoord.xy) + offsetBrightness) * (1.0 + offsetContrast);\
}\
\
technique brightness \
{ \
    pass p1 \
    { \
        PixelShader = compile ps_2_0 PSBrightnessContrast(); \
    } \
} \
";

Как я могу передать offsetBrightness и offsetContrast динамически?

1 Ответ

2 голосов
/ 14 января 2012

В HLSL все переменные, объявленные вне функции, могут быть изменены между каждым вызовом отрисовки.

Чтобы изменить их значение, вы можете использовать следующий установщик из ID3DXEffect:

HRESULT SetFloat( [in] D3DXHANDLE hParameter, [in] FLOAT f );

где hParameter может быть именем в виде char * или дескриптором, запрашиваемым с помощью GetParameterHandle()

Итак, в вашем примере:

effet-> SetFloat ("offsetBrightness", 0.5f);

Если вы находитесь внутри Begin()/End(), вам нужно позвонить CommitChanges(), чтобы применить эти значения

...