前言
本章使用 滤波效果来介绍使用 .cginc。
模糊效果,其实模糊也可以称之为重影,一般的模糊是边线分的不太清,而用重影解释的话,就是由于出现多个边线叠在一起了。滤波是数学或者物理上的一个概念,总体可以理解成将波动较大的波变成相对平缓的波,如果清晰对应于边线明显、边线两边颜色值跳跃过大的话,模糊就对应于边线不清晰,颜色值过度平缓,所以使用滤波是可以达到这种效果的。这里先看一张模糊的效果图,可以发现模糊的比较厉害的时候就出现了很明显的多个影子。
滤波、模糊
filter 方法是一个支持 3x3 滤波矩阵的滤波方法,在上节课中,我们已经将该方法写到 .cginc 文件中了,只需要调用即可。
下面是关键部分代码。其实是针对每一个像素的颜色值,将其与周围八个像素的颜色值进行平均混合,如图,对于箭头所指向的像素点(请无视我的画工 ORZ)来说,就好比将中间的白色取 1/9,其余八个其他颜色的格子也各取1/9,然后加在一起,这就是滤波的原理,因为混合在了一起,所以颜色就会相对之前趋于平缓、模糊。
1 | float _BlurOffset; |
具体代码 使用.cginc
具体 shader 代码如下,其中有一句 #include “Assets/Shader/UIDefault.cginc”,就把上节课的 .cginc 拿了过来,就可以使用其中的代码了。
有些部分还是得写在具体 Shader 中,而不能放到 .cginc,比如 Properities,自定义的属性,一些标签等。
由于我们实现模糊效果,只需要对颜色值进行一些操作,所以只需要自定义 ProcessColor 方法,在其中调用 filter实现,其余部分调用 vertdefault 和 fragdefault 即可。
1 | Shader "UI/Blur" |
滤波的其他用法
其实不光是 模糊效果,其余效果使用该方法也很可以实现,想一想和周围的像素进行比例取样,很多关于边界的效果都可以实现,主要针对的就是 矩阵里面的数值。大家可以改改数值试试能不能得到一些有趣的效果。