close

Radial Blur是一種動態模糊技術,通常用在賽車遊戲與FPS等。在賽車遊戲中能夠給於速度感,就像時感賽車中使用氮氣噴射一樣

ridge-racer-2-20060921112912820.jpg
FPS中通常是在玩家被打中時或是快死亡的畫面表現。

接下來將說明如何做出這樣的效果

首先,當然我們必須先把遊戲物件整個Render一次到Texture(Render Buffer)上,然後再將這張Texture來做後至處理。

Radial Blur是以畫面中央開始對各方向延伸出去,在uv-mapping上中心點是0.5, 0.5,再來就是將projection後的座標與之相減,就可以得到Blur的方向。在將這個向量的長度當做Blur的影響程度,就會有擴散的現象,中間blur效果小越往外就越多。當然也可以用固定的值來當做blur的程度。

接下來看看Shader Code是怎麼寫的

float g_sampleDist = 1.0f;
float g_sampleStrength = 2.2f;

float4 RadialBlur(in float2 UV : TEXCOORD0) : COLOR
{
    //設定取樣間距
    float samples[10] = {-0.08, -0.05, -0.03, -0.02, -0.01, 0.01, 0.02, 0.03, 0.05, 0.08};
    
    //計算方向性與距離    
    float2 dir = 0.5f - UV;
    float dist = length(dir);
    dir = normalize(dir);

    //先取得本來顏色並保存起來
    float4 color = tex2D(Tex, UV);
    float4 sum = color;
    //多重取樣其他pixel並混合
    for (int i = 0; i < 10; ++i)
    {
        sum += tex2D(Tex UV + dir * samples[i] * g_sampleDist);
    }
    sum *= 1.0f / 11.0f;
    
    //計算內差值,並內差出最後的顏色
    float t = clamp(dist * g_sampleStrength, 0.0f, 1.0f);
    color = lerp(color, sum, t);
    return color;

是不是很簡單呢,當然除了使用shader來做出這種效果之外
也可以用texture blending的方式來達成
原理就是,先render全景,再將這張貼圖存到另一張texture上
再改變第二張圖的uv值往內縮,如此就會有放大的效果,再用alpha blending來做混色處理
如此疊了很多層上去就會有這樣動態模糊的效果
但是這樣整個畫面都會糊掉,就連視點中間也會看不清楚
此時就可以用一張特殊的圖當做遮罩

目前就先介紹到這裡啦
謝謝大家收看 

arrow
arrow
    全站熱搜

    SnakeEater 發表在 痞客邦 留言(0) 人氣()