2012-01-13 74 views
1

我想通过动态更改偏移参数来改变亮度和对比度着色器的变化,但是我不想在每次更改着色器缓冲区时重新编译我的着色器。动态传递direct3d着色器参数

当前的shader代码是

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动态?

+0

你需要制服。我不知道DirectX,所以我不能告诉你如何使用它们,请阅读文档。 – 2012-01-13 08:36:13

回答

2

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

改变自己的价值,你可以使用下面的二传手从ID3DXEffect:

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

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

所以,在你的榜样手柄:

effet-> SetFloat(“offsetBrightness”,0.5f);

如果你是一个Begin()/End()里面,你需要调用CommitChanges()应用这些值