UnityShader-BilateralFilter(双边滤波,磨皮滤镜)

Unity】实现镜头虚化模糊效果(Blur):camera模糊,UGUI模糊,FairyGUI模糊效果 前言 起因是在一个FairyGUI项目里,有个项目需求要求弹出框的背景是虚化模糊效果,包括背景后的UI模糊和场景模糊,于是有了这一次unity实现模糊效果的测试记录。 先贴一下测试使用的unity工程: 使用FairyGUI建了一个UI界面,建造了一个Cube作为场景里的物体。 1.FairyGUI自带的模糊滤镜 FairyGUI可以使一个显示对象进入绘画模式,简单的说就是将目标对象整体画到一张纹理上,然后就可以操作这个纹理实现一些特殊的效果。这里简单使用到的就是对组件使用任意滤镜和对任意对象使用模糊滤镜 阅读详情

前言

最近趁着Steam打折入了好多个游戏,昨天刚刚通关了一个《Ruiner》的游戏。

游戏类似《孤胆枪手》,但是加入了很多技能元素和动作元素,加上游戏本身的卡通渲染+赛博朋克风格,总体感觉还是不错的。

国庆玩了几个大作连刷了几天,有点伤。最近反倒倾向于玩一些小游戏,简单粗暴。不用它三七二十一,莽夫上去就是干!

我发现blog也是这样,最近半年写的blog似乎都有点长,有时候也来点短小精悍的换换口味。今天就来玩一个简单但是又比较好玩的效果-双边滤波。

简介

双边滤波(Bilateral Filter),可能没有高斯滤波那样著名,但是如果说磨皮滤镜,那肯定是无人不知无人不晓了,用双边滤波就可以实现很好的皮肤滤镜效果,不管脸上有多少麻子,用完双边滤波,瞬间变身白富美。下图来自一款磨皮滤镜插件的效果图,左侧为原始效果,右侧为滤镜后的效果。本文中我们也会实现一个双边滤波后处理,可以达到近似的效果。

所谓滤波,是将信号中特定波段频率滤除的操作。正常高斯模糊(高斯滤波)在进行采样的时候,主要是考虑了像素之间的距离关系(空域信息domain),也就是按照正态分布将当前像素点周围像素加权平均得到滤波后的结果,可以得到很好的模糊效果。但是高斯模糊是对整个图像无差异地进行模糊,也就是整张图片全部模糊掉。关于高斯模糊,之前在Unity Shader后处理:高斯模糊这篇blog中详细介绍过,这里不再赘述。

高斯模糊的定义如下:

而双边滤波是高斯滤波进阶版本,可以在模糊的同时保持图像中的边缘信息。除了考虑正常高斯滤波的空域信息(domain)外,还要考虑另外的一个图像本身携带的值域信息(range)。这个值域信息的选择并非唯一的,可以是采样点间像素颜色的差异,可以是采样点像素对应的法线信息,可以是采样点像素对应的深度信息(3D渲染中拿到法线和深度还是要比单纯的2D图像处理可以做的事情多不少哈)。

双边滤波定义如下:

可见,除了正常的图像距离权重c之外,额外添加了图像相似信息权重s,而s是基于图像本身信息获得的,使用c和s相乘的结果作为最终的权重。即在采样图像及周围点时,对于每一个像素点,需要乘以距离权重乘以图片相似性权重相加得到总和,然后除以每一个像素点距离权重乘以相似性权重的和,即:

关于双边滤波对图像进行处理,可以参考《Bilateral Filtering for Gray and Color Images》这篇论文(似乎要出墙),上文高斯滤波定义,双边滤波定义公式均来自该论文。

基于颜色差值的双边滤波

先来看一下基于颜色差值的双边滤波,这是图像处理方面最常用的滤波方式,也是传说中的磨皮滤镜的实现方式。我们的值域信息权重来源于图像本身,也就是采样图像当前像素点,然后对于其周围的像素点,计算周围像素点与当前像素点颜色(转为灰度)后的差值作为权重进行双边滤波操作。

此处本人使用了后处理进行双边滤波操作,由于高斯滤波和双边滤波操作本身属于线性操作,可以拆分成横向纵向两个Pass进行,大大计算的时间复杂度。对于高斯模糊的正态分布函数,对于图像处理可以按照正态分布公式动态生成,不过在游戏这种性能吃紧的后处理中,直接使用预计算好的正态分布值即可。

Shader关键代码如下:

half CompareColor(fixed4 col1, fixed4 col2)
{
	float l1 = LinearRgbToLuminance(col1.rgb);
	float l2 = LinearRgbToLuminance(col2.rgb);
	return smoothstep(_BilaterFilterFactor, 1.0, 1.0 - abs(l1 - l2));
}

fixed4 frag_bilateralcolor (v2f i) : SV_Target
{
	float2 delta = _MainTex_TexelSize.xy * _BlurRadius.xy;
	fixed4 col = tex2D(_MainTex, i.uv);
	fixed4 col0a = tex2D(_MainTex, i.uv - delta);
	fixed4 col0b = tex2D(_MainTex, i.uv
图像处理-双边滤波 Bilateral Filtering Shader中实现双边滤波的时候,总感觉理解的不太透彻,这里写博客记录一下。 参考资料: 算法原理 GPUImage中Bilateral Filtering的实现 高斯滤波 空间域 在理解双边滤波之前,先来理解上面是高斯滤波。 高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。 为了实现线性的平滑,高斯滤波器和高斯分布(正态分布)是有关系的。 一个... 阅读详情

相关推荐

Unity Shader 非真实感渲染 卡通风格

Shader "MyShader/ToonShading" { Properties{ _Color("Color Tint", Color) = (1, 1, 1, 1) _MainTex("Main Tex", 2D) = "white" {} _Ramp("Ramp Texture", 2D) = "white" {} ...

songhuanfei2017的博客 969

Unity Shader 实现效果

最近在做一些UI使用的shader,大部分是对UV进行一些操作,今天看需求文档时发现美术同学的要求里有一项是类似的效果,本来我也比较好奇这些美颜效果都是怎么做的,所以就趁此机会实验以下。查了一大堆页面后发现可以实现效果的算法有很多,常用到的有 双边滤波器、表面模糊方法、选择性模糊方法等。勉强看明白了双边滤波和表面模糊方法的公式,所以以下就使用这两种方法在Unity中实现下效果。 双边滤...

博客标题 3155

美颜你的Unity--使用Lut为Unity调色

文章一般会先在我的自建博客发布,这边更新的会晚一些。 大家看了上面这张图片一定就明白本文的主题了,没错,今天的主题就是带大家一起舔小圆 (╯‵□′)╯︵┴─┴ 哈哈,不开玩笑了。上图展示了相机的一个常用的功能–滤镜,相信大家在用手机拍照的时候都用过滤镜吧,相机自带的滤镜可以一键调整照片色调,让我们不用专门学习相关的摄影知识就能拍出想要的效果,非常的方便与实用。今天要研究的内容就是在Unit

Irisviel的专栏 2万+

Unity 相机滤镜

滤镜管理代码(挂在Camera对象上)using UnityEngine; using System.Collections; [ExecuteInEditMode] public class CameraShader : MonoBehaviour { private Material mat; private Shader shader; private float ...

YasinXin的博客 1万+

Unity3D---通过Shader实现美颜

视频类APP没有美颜功能大概没人会用吧? 鉴于此,有点心血来潮,打算用Unity实现简单的美颜。 真正的商业级美颜算法是很复杂的,经过无数次打才成型,包括、美白、瘦脸、大眼等等细节,我这里只是用Unity3D的后处理技术做个简单的、美白。 首先,美颜一般针对的是脸部区域,我们得先识别出脸部区域。 完整的人脸识别算法,这在Unity3D中实现起来有点困难(不借助SDK),因此我们需要换个思路,仔细想想,我们也没必要进行人脸识别,我们大可识别出肤色区域,然后在肤色区域进行美颜。 Sh...

余梦生fighting的专栏 3193

Unity Shader】纹理实践2.0:基本属性&封装和滤波模式

介绍Unity中纹理面板的常用属性,及比较重要的封装模式和滤波模式的应用演示,最后演示了MipMap技术的应用效果。

qq_41835314的博客 1459

Unreal Engine 4 手绘风滤镜(Paint Filter)即 桑原滤镜(Kuwahara Filter)教程(上)

原文|《Unreal Engine 4 Paint Filter Tutorial》 作者|Tommy Tran May 1 2018 | 翻译 开发游戏的老王 阅读时长|25分钟 内容难度|入门级 本教程将会教你通过实现桑原滤镜(Kuwahara Filter)让游戏具有手绘风格

开发游戏的老王 3336

unity中实现毛玻璃模糊效果

全屏毛玻璃模糊效果原理全屏毛玻璃模糊效果的原理是使用RenderTexture来捕捉当前屏幕的画面,然后使用模糊算法对RenderTexture图像进行模糊处理,最后将处理后的图像显示在屏幕上。这种方法可以实现全屏的毛玻璃效果,但是需要较高的性能。部分对象毛玻璃模糊的原理是使用两个摄像机,一个摄像机只渲染需要模糊的物体,另一个摄像机渲染其他物体和背景。然后使用RenderTexture来捕捉第二个摄像机渲染的画面,对RenderTexture图像进行模糊处理,最后将处理后的图像作为材质贴在第一个摄像机渲染的

shguxudong11的博客 1336

Unity中实现(轮廓Shader滤镜效果

以下是一个简单的轮廓Shader的示例,你可以将其添加到你的Unity项目中并应用到一个材质上。请注意,这个示例是基于UnityShaderLab和Surface Shader的,它假设你正在使用Unity的内置渲染管线。在Unity中实现一个轮廓(Outline)Shader通常涉及到两个主要的步骤:首先,你需要渲染物体的正常颜色;然后,你需要以稍大的尺寸渲染物体的边缘,以产生轮廓效果。请注意,这个简单的轮廓Shader可能不适用于所有情况,特别是当物体具有复杂的几何形状或需要更精细的轮廓控制时。

lcfengokok的博客 649

Unity3d美颜滤镜

这个美颜滤镜效果,是全局,保留了肤细节,去除了青春痘和皱纹,整体提亮了下,人一下子变漂亮了。手机上运行良好。 借鉴了网上的平湖美颜算法,还有双边滤波。也参考shadertoy上的美颜效果。最后做出一版在unity运行的简单美颜效果。 相关文章: 平湖法算法:http://www.cnblogs.com/Imageshop/p/4709710.html 简单探讨可牛影像软件中具...

u011354054的专栏 8471

Unity3D 实现六角形花纹效果

今天为大家分享一下,如何做一个六角形花纹效果的小Demo。     欢迎加我的学习交流群: 575561285          好吧!废话不多讲,我直接上图操作!     1.新建一个Unity3d 项目,新建一个CameraFilterPack_AAA_SuperHexagon.shader文件。 Shader "CameraFilterPack/AAA_Super_Hexa

Cici_coach的博客 1461

Unity后处理(Post-processing)

Unity post-processing 就像是对图片采用滤镜一样(如下图对比)对当前场景显示做一定的显示处理,使得场景更漂亮、有趣或者有型。

m0_66358314的博客 7877

【项目分析笔记】卡通感风格的渲染方法和思考

本文是基于腾讯TA大咖的一篇分享作的笔记,主要内容来自于Unity社区的分享,下面指路。基于个人的阅读习惯和一些陌生的方法做了补充和引用。主要是面对NPR的一个渲染效果分析,通俗易懂适合新手阅读。 引用及原文地址指路如下: 腾讯TA大咖分享,做卡通渲染时对风格和影视化的探索 Unity NPR之日式卡通渲染(基础篇) kuwahara filter 实现 1、卡通渲染到写实渲染之间的质感比较: 2、构成卡通感的几个要素,从以下思路入手渲染: (1)减少色阶的数量(色阶的控制) A使用Smoothstep

SummerStarTREE的博客 9200

Unity Shader 简单美颜

一、原理 参考博文Unity Shader 实现效果Bilateral Filters(双边滤波算法)原理及实现(二)对肤美白算法的一些研究 美白公式 效果:图像两端(-)变化弱,中间变化强。 w(x,y)为输入的像素颜色,v(x,y)为输出的像素颜色,beta为调节参数。 双边滤波公式 效果:保边去噪 (高斯滤波函数) g(i,j)为输出的像素颜色,f(k,l)为当前输入的像素颜色,S(i,j)是指以(i,j)为中心的(2N+1)*(2N+1)的卷积核覆盖的像素区

qq_33845262的博客 1513

思科模拟器32位_怀旧游戏不要打开即玩!科普模拟器里各种常用滤镜的原理和效果...

模拟器中的 Filter 或 Shader 基本都是基于图像本身的。一般来说模拟器不会提供与几何相关的 shader(32 位机以后会有少量这类 shader)。也就是说,模拟器滤镜生成的图像都是在不清楚游戏本身运行逻辑的情况下,单纯对最终输出的图像进行变换。因此这里用 Filter 远比用 Shader 来得更为精确。不过因为 RetroArch 的滤镜系统将其称为 Shader,因此之后将不分...

weixin_39852688的博客 3334

Bilateral Filtering(双边滤波) for SSAO

1. 简介 图像平滑是一个重要的操作,而且有多种成熟的算法。这里主要简单介绍一下Bilateral方法(双边滤波),这主要是由于前段时间做了SSAO,需要用bilateral blur 算法进行降噪。Bilateral blur相对于传统的高斯blur来说很重要的一个特性即可可以保持边缘(Edge Perseving),这个特点对于一些图像模糊来说很有用。一般的高斯模糊在进行采样时主要考虑了像素

BugRunner的专栏 5万+

【NPR】Unity3D非真实感渲染----铅笔画滤镜

关于Unity3D下的NPR滤镜-----铅笔画风格滤镜

blinkseed的专栏 8948

【游戏开发小技】Unity通过UI全屏图来模糊场景画面(Shader | 模糊 | 滤镜 | Blur)

【游戏开发小技】Unity通过UI全屏图来模糊场景画面(Shader | 模糊 | 滤镜 | Blur)

linxinfa的专栏 1万+
上一篇: Unity Shader-反射效果(CubeMap,Reflection Probe,Planar Reflection,Screen Space Reflection)
下一篇: 《3D数学基础:图形与游戏开发》读书笔记
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2692粉丝 161原创
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值