【UE4】徑向模糊 RadialBlur(PC and Mobile)

效果示例

  圖片爲百度上找的 徑向模糊 的示例圖(網遊中常見的輕功,向前飛的時候,屏幕會變得模糊,給玩家一種 衝刺加速 的感覺,這種模糊是從屏幕中心,沿着一圈圈同心圓向外傳遞的,這就是徑向模糊 Rdial Blur)。

實現方法

  首先需要在 UE4 中創建一個 MaterialUE4 中的材質都是創建一個 Material,然後用的時候用這個材質創建 Instance,這樣調整 Instance 不會修改原始 Material嗎,就像類的實例化,然後分別調整每個實例。)。
  創建 Material 可以參考官方文檔:Creating and using Material Instances,或者參考本文文末參考資料中的第一個視頻。

說明

  • 本文使用的是 UE 4.25.1,但是參考資料基本都是 4.1x 所以應該都適用
  • 本文使用的是 UE4 自帶的 Third Person Template

具體步驟

  • 注:本文使用的是 UE4 自帶的 Third Person Template;
  1. 首先在 UE4 Content Browser 中的合適文件夾中,右鍵創建一個 Material,命名爲 “M_PP_RadialBlur”(即 Material PostProcess),打開;
  2. 目前圖中只有一個節點(Result Node),名爲剛剛命名的 “M_PP_RadialBlur”,在它的 “Material” 中將 “Material Domain” 修改爲 “Post Process”,這時圖中的 Result Node 只有一個 input 可以用了,是 “Emissive Color”;
  1. 右鍵搜索並添加 “SceneTexture” Node,並將它的 “Scene Texture Id” 修改爲 “PostProcessInput0”
  2. 從它的 “Color” 輸出拖出一個 “ComponentMask” Node,並將其 RGB 三個選項都勾選上;
  1. 右鍵添加 “ScreenPosition” Node,並將其 “ViewPortUV” 輸出連接到 “SceneTexture:PostProcessInput0”“UVs” 輸入;
  2. 右鍵添加 “LinearInterpolate” Node(或者按住 “L” 鍵,鼠標左鍵點擊屏幕,即可快速添加;右鍵搜索 “Lerp” 也可以);
  3. 右鍵添加 “RadialGradientExponential” Node,和 “ScreenAlignedUVs” Node,將其 “X 100%, Y 100%” 輸出連接到 “RadialGradientExponential”“UVs(V2)”
  4. 右鍵添加 “ScalarParameter” Node(或者按住 “S” 鍵,鼠標左鍵點擊屏幕,即可快速添加),命名爲 “BlurRadius”,將 “DefalutValue” 設爲 1,連接到 “Radius(S)”
  5. 再次添加 “ScalarParameter” Node,命名爲 “Density”DefalutValue 設爲 4,拖出 “OneMinus” Node(也可以直接搜 “1-”),並連接到 “Density(S)”
  6. “RadialGradientExponential” 的輸出連接到 “Lerp”“Alpha”
  1. 右鍵添加 “Custom” Node,它的 “Details” 中,“Code” 是渲染代碼(HLSLHigh Level Shading Language)的位置,默認只有一個 “1”,複製如下代碼到 Code 中;
const float2 ScreenMult = View.ViewSizeAndInvSize.xy * View.BufferSizeAndInvSize.zw;

const int TexIndex = 14;
const float Samples[11] = {-0.08,-0.05,-0.03,-0.02,-0.01,0,0.01,0.02,0.03,0.05,0.08};

float2 dir = float2(0.5,0.5) - ScreenUV;
float4 sum = float4(0.0, 0.0, 0.0, 0.0);
for(int i = 0; i<11; i++)
{
    float2 pos = ScreenUV + dir * Samples[i] * BlurDist;
    pos = clamp(pos, float2(0.0,0.0), float2(1.0, 1.0));
#if (ES2_PROFILE || ES3_1_PROFILE || MOBILE_EMULATION)
    sum += MobileSceneTextureLookup(Parameters, TexIndex, pos * ScreenMult);
#else
    sum += SceneTextureLookup(pos * ScreenMult, TexIndex, false);
#endif
}

return sum / 11.0;
  1. “Description” 改爲 “Radial Blur”,在 “Input” 中添加 “BlurDist”"ScreenUV ",對應 Code 中的變量;
  2. “ScreenPosition”UV 連接到 “Radial Blur”UV
  3. 添加 “ScalarParameter”,命名爲 “Blur”DefalutValue 設爲 1,連接到 “BlurDist”
  4. "RadialBlur" 的輸出連接到 “Lerp”“B”“Mask(R G B)” 的輸出連接到 “Lerp”“A”,就可以看到徑向模糊的效果了!!!
  1. 到這裏 Material 就創建好了,“Apply”“Save”、關閉;
  2. “Content Browser” 中,右鍵剛剛創建的 “M_PP_RadialBlur”,選擇 “Create Material Instance”,命名爲 “MI_PP_RadialBlur”(即 Material Instance);
  3. 打開,可以看到 “Parameter Group” 中有三個我們設計的變量可以調整,效果就和文章開頭的 GIF 效果一樣,Save,關閉;
  4. 在場景的 “World Outliner” 中搜索 “PostProcessVolume”,在 “Details” 中搜索 “Post Process Materials” 並添加一個 “Asset Reference” 並選擇剛剛創建的 “MI_PP_RadialBlur”(注意是 Instance!),可以看到場景已經變成模糊的樣子了,點擊 Play 效果如下所示;
  1. 完成!

參考資料

  1. UE4 Tutorial: Radial Blur
  2. For Mobile

  第一個資料對材質進行創建和配置,但是會出現 SceneTextureLookup 無法在 ES3.1 上使用的問題,所以添加了宏,在手機上使用 MobileSceneTextureLookup。第一個右鍵看一下就知道了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章