ShaderGraph能量护盾(二):UV扰动和空间扭曲

在 Youtube 上刷到了 Unity Japan meetup 2019 的分享视频,其中 ShaderGraph 的分享非常不错,跟着学习下。

前言

前文:ShaderGraph能量护盾(一):接触面检测及边缘发光

Shader 主要包含如下内容:

  • 接触面检测
  • 边缘发光
  • UV扰动及贴图混合
  • 空间扭曲(或空间扰动?)

本文章为 UV 扰动贴图混合、空间扭曲部分。

效果

在前文的基础上,增加了菱形贴图混合和空间扭曲:

前文效果:

实现

UV 扰动与贴图混合

基于Time 数值对 UV 的 XY 进行 Add、Multiply、Sine 等数学计算。

在此基础上,加入噪声图(Gradient Noise 等),与新 UV 下采样的 RGBA Color 相乘,叠加噪声图的 Alpha 效果。噪声图的 Offset 也基于 Time 和其他数学运算进行偏移。

总之,一堆数学运算节点互相叠加,得到想要的效果后,将得到的 RGBA Color 与上一篇文章中计算得到的 RGBA Color 相乘,完成混合。

个人理解,这部分的扰动效果主要取决于个人经验,经验丰富的技美会根据需求选择合适的计算方法,因此上述计算节点没有特别高的参考价值。

空间扭曲

build-in 管线的 GrabPass

使用传统渲染管线时,我们可以在 Shader 中增加 GrabPass 来获取当前渲染的 Buffer(以 Texture 方式使用),我们利用该 Texture 做高斯模糊、空间扭曲之类的效果。

URP 以硬编码的方式写了几个固定的 Pass,因此旧 Shader 的 GrabPass 不会被执行。哪怕以 RenderFeatures 的方式添加对 Pass 的调用,也不会有 Build-in 那样的图喂给 Pass。

URP

曾几何时,在 URP 默认管线代码下,有一些中间态或临时态 Texture 可以被我们利用,例如_CameraColorTexture,_CameraOpaqueTexture,_AfterPostProcessTexture等。

不过,目前能够被稳定使用的好像只有_CameraOpaqueTexture

一般情况下,我们使用_CameraOpaqueTexture足矣,但它的缺点很明显:它是不透明物体渲染队列的渲染结果,不包含半透明物体。

如果想要获取半透明物体的渲染结果,有两种做法:

  • 增加一个 URP RendererFeatures(RenderObjects),把自己 Shader 的 Pass 加进去,并调整 Queue 等值,确保在合适的时机调用自己的 Pass,从而自己的 Pass 中搞事情(例如开启 Camera Stack 来获取 _AfterPostProcessTexture)。
  • 改 URP 管线源码,以硬编码的形式增加其他 Pass 和相关处理(Unity 自己就这么干,详见 URP 源码)。

当然,说这些有些扯远了,本文使用_CameraOpaqueTexture即可。

连连看

ShaderGraph 中获取_CameraOpaqueTexture很简单,添加一个名字为_CameraOpaqueTexture的参数即可。

使用噪声图对片元采样_CameraOpaqueTexture时的 UV 做变化扰动,实现空间扰动效果:

空间扭曲的颜色应该与上文的特效颜色做 Alpha Blend,但分享会的做法简单粗暴:直接使用两个 Material/Shader,先渲染空间扭曲,再渲染特效颜色,让 Unity 自己去叠。

当然,在同一个 Shader 中也是可以的,但需要增加好几个节点(吐槽一下:如果用代码写的话,大概几行字就可以搞定)。

最终结果

梓喵出没博客(azimiao.com)版权所有,转载请注明链接:https://www.azimiao.com/9999.html
欢迎加入梓喵出没博客交流群:313732000

我来吐槽

*

*