动态传递direct3d着色器参数

passing direct3d shader parameters dynamically

本文关键字:参数 direct3d 动态      更新时间:2023-10-16

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

当前着色器代码为

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

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

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

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

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

所以在你的例子中:

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

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