欢迎光临散文网 会员登陆 & 注册

《Unity Shader》第十二章—屏幕后处理效果小结

2023-04-01 21:34 作者:农民能对空  | 我要投稿

再次来写这次的小结啦。但总之写起来感觉真的没有想象中那么简单,所以还是长话短说,把最大的思路写下来就是我能做到最多的了QWQ.

    首先说说这一章总体内容好了.先学习了一个基类脚本,我们需要在这个基类中实现后处理所需的 shader 与 我们所用的作用于 OnRenderImage参数中的scr的 材质 的绑定(同时也check了后处理是否支持、shader是否可用。)有了这个基类,我们后面的脚本都将会继承这个基类,并使用该功能自动生成一个private的material.

    好吧,这里有点废话了,毕竟这是这章最最最基本的玩意儿了。剩下的都是分支出来的:亮度+对比+饱和度的调整实现、边缘检测(描边)的实现、高斯模糊的实现、Bloom效果的实现、运动模糊的实现。

    先说第一个,这块其实最重要的是提出了一个luminance的概念:我们可以通过一个像素的RGB通道计算出他的亮度值,然后通过这个亮度值去赋值给一个fixed3的rgb分量来表达一个片元的亮度(?)(这里存疑,笔者是这样理解的,不知道对不对)然后利用这个”白度”加上我们的饱和度的量去和原本的颜色插值,得到运用饱和度后的颜色。对比度也是同理,不过我们需要用一个avgcolor(0.5,0.5,0.5)去和我们缓存的color进行插值.

    亮度的效果很好理解,不再赘述。剩下的都是笔者的猜测。饱和度是为了调整颜色的鲜艳程度(因为趋近于0时不会存在颜色差异,只有亮度差异了),而对比度是为了制造一种亮暗通道的差分。对比度越大,越亮的通道越亮,而越暗的通道会越暗。

    第二个边缘检测。这里也是引入了一个相当重要的计算:卷积。笔者理解就是有几何意义的加权算法。而这里是为了计算出像素的颜色的变化(梯度)而使用的。利用卷积,我们可以轻松得到某个片元的颜色梯度,并利用该梯度插值。从而得到一个像素的原图+边缘颜色值和背景+边缘颜色值。并通过另一个参数来插值从而决定原图颜色的保留程度。

    第三个高斯模糊,其实这个和上一个原理相同,也是卷积。不过这里的几个参数还是蛮有意思的,以及一个双buffer的循环替换过程。这里就不过多讲解了,自己看书吧!

    第四个bloom。这里其实就是需要先对图像做一个特殊的处理,也就是提取亮部纹理输出。利用了一个clamp函数来看究竟是否需要裁剪以及保留多少。然后就是和高斯一个路子了,将我们的亮部纹理不停卷积并使用高斯模糊。然后利用源纹理和高斯后亮部纹理相加即可。不过这里还有一个关于纹理坐标的平台差异化处理需要注意。因为我们使用了额外的纹理,因此这张额外纹理需要多检测一下平台,以防止反转。

    第五个运动模糊。这里与上面不同。我们需要一个不停存储并混合我们图像的一张纹理,然后不停地将其与我们的新纹理混合,并输出。这里学习一下纹理的恢复操作与保留A通道的处理即可。

    这些大概就是这一章的内容了。写的好累.QWQ

安宝可爱捏


《Unity Shader》第十二章—屏幕后处理效果小结的评论 (共 条)

分享到微博请遵守国家法律