高品质后处理渲染技术分享:十种图像模糊算法的总结与实现( 十 )



for (int j = 0; j < _Iteration; j++)
{
r += 1.0 / r;
angle = mul(rot, angle);
half4 bokeh = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, float2(i.texcoord + _PixelSize * (r - 1.0) * angle));
accumulator += bokeh * bokeh;
divisor += bokeh;
}
return accumulator / divisor;
}

即对于每一次迭代 , 让采样uv旋转一个角度 , 经过足够次数的迭代后 , 众多以圆形分散开来的点 , 将一起组成合适的Bokeh形状 。

完整的Runtime + Shader实现可见:

https://github.com/QianMo/X-PostProcessing-Library/tree/master/Assets/X-PostProcessing/Effects/BokehBlu
r

下图为最终实现的效果图:

高品质后处理渲染技术分享:十种图像模糊算法的总结与实现
文章图片


不同模糊半径(Blur Radius)变化 , 可以控制不同的Bokeh半径的变化:

高品质后处理渲染技术分享:十种图像模糊算法的总结与实现
文章图片


六、移轴模糊 (Tilt Shift Blur)


移轴模糊(Tilt Shift Blur
) , 又称镜头模糊(Lens Blur
) , 是源自摄影领域的一种模糊算法 。

在摄影领域 , 移轴摄影(Tilt-Shift Photography
)泛指利用移轴镜头创作的作品 , 所拍摄的照片效果就像是缩微模型一样 , 非常特别 。 移轴镜头的作用 , 本来主要是用来修正以普通广角镜拍照时所产生出的透视问题 , 但后来却被广泛利用来创作变化景深聚焦点位置的摄影作品 。 移轴镜摄影是将真实世界拍成像假的一样 , 使照片能够充分表现出“人造都市”的感觉 。

高品质后处理渲染技术分享:十种图像模糊算法的总结与实现
文章图片

图 移轴摄影作品


在后处理渲染中进行移轴摄影的模拟 , 可以采用Grident uv算法控制画面区域模糊强度 , 配合全屏模糊算法的方式来实现 。

采用Grident uv算法控制画面区域模糊强度的Shader核心实现如下:

float TiltShiftMask(float2 uv)
{
float centerY = uv.y * 2.0 - 1.0 + _Offset; // [0,1] -> [-1,1]
return pow(abs(centerY * _Area), _Spread);
}

得到的屏幕模糊强度的mask图如下:

高品质后处理渲染技术分享:十种图像模糊算法的总结与实现
文章图片


接着 , 配合合适的全屏图像模糊算法 , 如Bokeh Blur , 便可以营造出移轴摄影的画面感:

高品质后处理渲染技术分享:十种图像模糊算法的总结与实现


推荐阅读