原文:
【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);
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,則得到如下效果:
Scale=1.06
Scale=0.9
采用這個方法,利用不同的算法可以很友善地得到各種不同的特效。