【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]

原文:【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]

方位模糊是一个按照指定角度循环位移并叠加纹理,最后平均颜色值并输出的一种特效。效果如下图:

Angle=0;BlurAmount=0.1;

【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]

 

Angle=45;BlurAmount=0.1;

【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]

看看源代码:

++++++++++++++++++++++++++++++++++++++

         //模糊的角度

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,则得到如下效果:

【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]

 

Scale=1.06

【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]

 

 

Scale=0.9

【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]

 

采用这个方法,利用不同的算法可以很方便地得到各种不同的特效。

上一篇:margin-right没有效果的问题


下一篇:css学习_css背景属性及其应用