磨皮效果图:
上面的效果图,从上到下分别是:原图效果、表面模糊滤波效果、双边滤波方式圈选出五官的效果和表面模糊与双边滤波共同作用的效果;
使用双边滤波方式,得到的磨皮效果较为模糊,在此我们使用另一种方式,表面模糊的方式来处理;
表面模糊可以在保留边缘的情况下对图像平坦区域进行模糊滤波,这个功能可以实现很好的磨皮效果,它的算法如下:
表面模糊:
这个算法很简单,设置半径r,得到一个边长为(2r+1)的正方形窗口,那么窗口中心像素的像素值即为x,当然,对于像素的RGB三个分量,是需要分别计算的,因此这个算法的时间消耗比较大。
类似的算法还有双边滤波等,不过这类滤波普遍都比较耗时,虽然双边滤波已经可以在PC上实时,但是,在手机端还存在较大问题。
表面模糊的shader代码实现如下:
// 磨皮效果, 使用表面滤波方式, 计算量很大不建议移动设备上使用 //
Shader "SkinGrind/UI/Buffing_SurfaceFilter"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Radius("Radius", Range(0, 20)) = 1 //半径
_Threshold("Threshold", Range(0,0.3)) = 0 //阈值
_Brightness("Brightness", Range(0,10)) = 0 //亮度
}
CGINCLUDE
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
};
sampler2D _MainTex;
float2 _MainTex_TexelSize;
float4 _MainTex_ST;
float _Threshold