天天看點

【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);

    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;

設定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]

采用這個方法,利用不同的算法可以很友善地得到各種不同的特效。

繼續閱讀