原文:【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]
方位模糊是一个按照指定角度循环位移并叠加纹理,最后平均颜色值并输出的一种特效。效果如下图:
Angle=0;BlurAmount=0.1;
Angle=45;BlurAmount=0.1;
看看源代码:
++++++++++++++++++++++++++++++++++++++
//模糊的角度
float Angle : register(C0);
//模糊的数量
float BlurAmount : register(C1);
sampler2D implicitInputSampler : register(S0);
float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 c = 0;
//0.0174533的含义是2*PI/360,这里是将角度转化为弧度
float rad = Angle * 0.0174533f;
//计算x、y轴的偏移分量
float xOffset = cos(rad);
float yOffset = sin(rad);
//
for(int i=0; i<16; i++)
{
//利用角度参数和模糊的数量参数来定义新的纹理坐标
uv.x = uv.x - BlurAmount * xOffset;
uv.y = uv.y - BlurAmount * yOffset;
//将每一次的纹理都叠加
c += tex2D(implicitInputSampler, uv);
}
//求取纹理颜色的平均值
c /= 16;
return c;
}
++++++++++++++++++++++++++++++++++++++
代码非常简单,不过对纹理进行偏移然后叠加,最后将叠加的值进行平均,这种方法还是头一次见,如果不进行最后一步平均,得到的将是纯白的画面,因为经过16次循环叠加的向量c,其中的rgba值都应该远大于1了,所以变成了纯白。
根据这种思想,我们可以稍微改变一下,得到自己想要的效果,比如爆炸效果或者汇聚效果等。这里稍作改变如下:
+++++++++++++++++++++++++++++++++++++++
float Scale : register(C0);
sampler2D implicitInputSampler : register(S0);
float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 c=0;
for(int i=0;i<5;i++)
{
//设置缩放比例
uv.xy/=Scale;
//设置缩放后的原图中心依然位于整个画面的中心位置
uv.xy+=(1-1/Scale)/2;
c+=tex2D(implicitInputSampler,uv);
}
c/=5;
return c;
}
+++++++++++++++++++++++++++++++++++++++
设置Scale为1.02,则得到如下效果:
Scale=1.06
Scale=0.9
采用这个方法,利用不同的算法可以很方便地得到各种不同的特效。