Unity Shader - PS磨皮效果(表面模糊方式实现)

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

磨皮效果图:

 

上面的效果图,从上到下分别是:原图效果、表面模糊滤波效果、双边滤波方式圈选出五官的效果和表面模糊与双边滤波共同作用的效果;


使用双边滤波方式,得到的磨皮效果较为模糊,在此我们使用另一种方式,表面模糊的方式来处理;

表面模糊可以在保留边缘的情况下对图像平坦区域进行模糊滤波,这个功能可以实现很好的磨皮效果,它的算法如下:

表面模糊:

这个算法很简单,设置半径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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值