Radial Blur(径向模糊)效果,是一种从屏幕中心向外呈幅射状的逐渐模糊的后期效果,一般出现在镜头高速运动的时候。
径向模糊的特点是从某个像素为中心向外辐射状扩散,因此需要采样的像素在原像素和中间点像素的连线上,不同连线上的点不会相互影响。 简单的说,就是像素的颜色是由该像素的点与中心点之间连线上进行采样(如图),然后求将这些采样点颜色的加权平均和作为该像素的颜色。[1]
本文以UE4的Third Person示例工程为例,实现Radial Blur效果,并进行效果动态控制和效果剔除的扩展。
后期材质
在工程的Content目录新建一个Post Process材质M_RadialBlur,材质节点如下图:
图中RadialBlur结点为Custom节点,Code代码为:
static const int SceneTextureId = 14;
float2 UV = GetDefaultSceneTextureUV(Parameters, SceneTextureId);
float3 Sum = float3(0, 0, 0);
float2 Dir = float2(CenterX, CenterY) - GetViewportUV(Parameters);
for (int it = 0; it < SampleNum; it++)
{
float2 UVOffset = it * Offset * length(Dir) * Dir;
#if SHADING_PATH_MOBILE
Sum += MobileSceneTextureLookup(Parameters, SceneTextureId, UV + UVOffset).rgb;
#else
Sum += SceneTextureLookup(UV + UVOffset, SceneTextureId, false).rgb;
#endif
}
return Sum/SampleNum;
其中:
1.SceneTextureId做为SceneTextureLookup的第二个参数,值14表示采样对象为Post Process Input 0。
Post Process Input 0对象为当前屏幕已绘制内容,相当于 Unity中后期回调函数void OnRenderImage(RenderTexture source, RenderTexture destination)中source的colorBuffer。
2.UVOffset用于计算采样偏移量,采样方向Dir由中心位置减当前像素位置得到,偏移程度由length(Dir)得到,使离中心点越远,偏移量越大。
3.SampleNum表示采样次数,多次采样叠加的颜色除于采样次数得到最终的颜色,采样次数越高,最后得到的图像越连续。
自定义usf文件
Shader代码可以直接在Custom节点的Code文本框编辑,但更合理的做法是自定义一个