接着上篇文章,今天想给大家分享一下如何实现操作简单、效果佳的变焦模糊(Zoom blur)效果。(Photoshop中径向模糊的一个选项)
在实现变焦模糊之前,我先说一下模糊的原理。先看下如何在Photoshop中不用模糊功能,来实现模糊。
打开Photoshop。
上图是我准备好的源图像,在原始图像上创建10个复制图层,并把透明度设置为10%。
把10个图层依次向左移动5个像素,向右移动5个像素。
上图右边标记的数字代表我移动的像素数。
哦哈!看上去好像有一丢丢模糊的感觉了呢!
实现模糊主要有两种方法。
1.按uv偏移的次数来重复采样,然后把采样结果相加再除以采样数。(某位大佬指点:作者使用的方法,详细解释是uv偏移时就重复采样一次(如果偏移10次就重复采样了10次),从-5到5有10个值,这10个采样结果对最终结果贡献都是10%,嗯!)
2.有四个方向的位移,uv偏移后进行下采样再把结果叠加,以增加模糊范围。
方法2虽然性能开销小些,但只能用于高斯模糊或定向模糊,不能用于变焦模糊。从这里也可以看出,变焦模糊要比其他方法更耗性能一些。
刚刚我试了左右偏移的效果,这次我稍微放大下中央区域的大小(大概101%),是不是有点变焦模糊的感觉了?
挺不错的!
我们也可以用这个方法加点淡淡的alpha来做毛发,得到层层堆叠的效果。这样子的毛看上去也有点模糊的感觉。
我们按原理来做一下吧。
基于前文内容得到RadialBlurImageEffect.cs和RadialBlurImageEffect.shader,先看下shader。
如果我们不需要特殊顶点的计算,调用vert_img函数的话,可删除vert函数定义,来提高代码的可读性。如不用在vert中添加其他东西的话,这样就ok了。
如上图所示,我添加了 _ BlurCenterPos,_ Samples和_BlurSize变量。
_ MainTex_TexelSize是一个变量,占用一个像素点。本文中_ MainTex = ScreenSize,所以若长是1024的话,那么值就为1/1024。_ BlurCenterPos是模糊的中心位置(默认值是0.5,我设为0.5),_ Samples是采样数,_ BlurSize是为了得到模糊效果而偏移的距离。
在frag函数中,我们用for语句来一次性实现它吧!
重复采样( tex2D)足够的样本数,但要基于中心位置来缩放uv。(UV中的缩放是“乘法”)
unity中的uv左下角是(0,0),中央是(0.5,0.5),所以默认uv乘以缩放距离的话,那缩放就是基于左下角为标准进行的。
效果图如上。
那么,用(-0.5, -0.5)把画面中心移到(0,0),设置缩放值后,再加上(0.5,0.5)让它重回原始位置,这样一来中央区域就产生了模糊效果。看下图可方便理解。
通过重复采样得到模糊值。现在我们只需要把结果加起来再相除就可以了。
RadialBlueImageEffect.cs也一样。
由于采样数用在for语句中,用int()来装载和传递的小数点可能会稍有不同。(用float也行,因为unity会自动舍弃小数点)
另外,当blurSize为0时,为了让source直接成为结果值,我优化了代码。
酱紫,模糊效果就搞定了!
放上动图感受下~
谢谢!bye!
[原文来源] 유니티 포스트 프로세싱 이펙트 만들기 (4) - 줌 블러|作者 Madumpa
本文仅限于学习参考交流,请勿做商业用途和随意转载。
译者碎碎念:句子理不清楚也不懂,干烦恼TT,感谢纯一大佬帮忙赐教解救,很多谢谢~
这个系列4篇文章终于搞定!oyeah!!!
最近在思考文章怎么样翻译最佳,好像直译一遍后,再加以意译,效果会比较好。hmmm,如果我都能大概理解的话,各位应该都能明白,嗯?噗嗤嗤笑~
闲时翻译的初衷?想想...师夷长技以制夷,算吗?hhhhhhh日常练手翻译技能+1
也不知道能坚持多久,努力生长叭~
Qinfei
2020/8/30