磨皮效果图:




上面的效果图,从上到下分别是:原图效果、表面模糊滤波效果、双边滤波方式圈选出五官的效果和表面模糊与双边滤波共同作用的效果;
使用双边滤波方式,得到的磨皮效果较为模糊,在此我们使用另一种方式,表面模糊的方式来处理;
表面模糊可以在保留边缘的情况下对图像平坦区域进行模糊滤波,这个功能可以实现很好的磨皮效果,它的算法如下:
表面模糊:

这个算法很简单,设置半径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;
int _Radius;
float _Brightness;

本文介绍了如何在Unity中使用Shader实现磨皮效果,对比了双边滤波和表面模糊的区别。表面模糊能在保持边缘清晰的同时对图像平滑区域进行模糊,适合于磨皮。文中给出了具体的Shader代码实现,并通过结合双边滤波处理五官区域,避免了过亮问题,最终实现了理想的磨皮效果。
最低0.47元/天 解锁文章
2090

被折叠的 条评论
为什么被折叠?



