1

我想通过动态更改偏移参数来更改亮度和对比度着色器,但我不想每次更改着色器缓冲区时都重新编译着色器。

当前的着色器代码是

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(); \
    } \
} \
";

我怎样才能动态地传递offsetBrightnessoffsetContrast

4

1 回答 1

2

在 HLSL 中,在函数外部声明的所有变量都可以在每次绘制调用之间更改。

要更改它们的值,您可以使用 ID3DXEffect 中的以下设置器:

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

其中 hParameter 可以是 char * 的名称或使用查询的句柄GetParameterHandle()

所以在你的例子中:

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

如果您在 a 内Begin()/End(),则需要调用CommitChanges()以应用这些值

于 2012-01-14T07:37:18.927 回答