人人有功练 Unity URP管线透明折射扭曲材质的一系列实践(一)两种渲染时机的扭曲材质
Yves
小溪塔罗河路第二TA
扭曲效果是比较常见的,特别是特效里面经常需求。甚至可以说扭曲和辉光是直接决定你特效有没有逼格的关键的两个技术。在过去的管线中扭曲所需要的抓屏图非常依赖硬件来实现,而中国的游戏又是以手机游戏为主,手机硬件实现抓屏的方法五花八门甚至会有保存抓屏图之后重新回到GPU这种非常卡顿的方法。而URP作为一种可编程渲染管线非常贴心的为我们准备好了这张图,他是在物体对象(Oqaque)之后直接在管线copy的一张图避免了上述造成卡顿的痛点,不用白不用冲这点我也坚决选择URP管线。不过它的缺点是这张图是不包含透明对象的无法扭曲透明对线,做特效的话就效果不对,我们先用ASE快速得到一个扭曲的材质。然后我们使用一个方法来得到可以扭曲透明对象并包含后期效果的材质。
首先我们需要在管线的渲染设置中打开这张贴图。打开unity左上Edit→projectsettings 点一下图形设置Graphics上挂载的渲染设置。
打开Opaque Texture 打勾。
然后我们下载安装 ASE插件(建议正版)
创建ASE 材质 左边面板设置为。Universal即为通过管线 URP下的材质,设置为透明队列只有透明队列之上才能使用抓屏的图。
用 世界坐标+法线图偏移UV 去采样抓屏图输出为颜色。ASE做就很简单,然后我们就得到了一个基本的扭曲材质。
贴图要设置为法线贴图,默认为BUMP也就是平的法线。利用法线强度调节扭曲强度。
但是尴尬的是,透明对象看起来直接被切掉了。所以这个默认的抓屏图适合做冰块水面玻璃这种物体的材质,如果是特效需要的冲击波这类扭曲需要另外的方法。实际上URP管线中给我提供了很多COPY的图,我们这里使用_AfterPostProcessTexture这张贴图,他是在后期处理完成之后保存这张图。然后利用RendererFeatures新建一个渲染时机,并新建一种LightMode Tags类型。这样所有Tags是Grabs2的shader都会在后期处理完成之后渲染。
不过我们要保存这张贴图必须要摄像机堆栈的功能,这样设置。
设置为Overlay Culling Maks Noting啥都不渲染
在Stack里添加这个子相机,POST 后处理这个勾一定要勾上
然后我们创建一个新的shader,LightMode Tags改成我们刚才新建的。
AfterPostProcessTextureASE没有这个节点,我采样一张全局变量的叫AfterPostProcessTexture贴图即可。其他算法可以和第一个一样。
Type设置为 Global自动会找到这张图,在管线中unity已经保存会全局变量贴图
不过这个效果只有运行后才能看到,我们运行一下。
已经扭曲了后面的红色半透明球体而且兼容后期处理效果,完美。
目前我们一行代码都没有些就完成了功能,非常快不影响你去完成其他工作。后续会添加代码和查缺补漏,这个系列(二)会帮小伙伴解决一下UI上想用扭曲和讲一下一些特效扭曲背后和扭曲自己,抓屏并透明抓屏和物体过度和粒子系统结合等一系列实际运用中的问题。
参考文章:Unity URP shader做热空气扭曲与Bloom冲突问题