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

URP | 屏幕深度制作护盾特效

2022-03-12 16:47 作者:那个人真狗  | 我要投稿



目的

  • URP管线下获取深度方法。

  • 实现菲尼尔效果。

  • 使用顶点动画制作一个简单的效果。

设置

  • 大开渲染管线确认是否开启深度(Depth)

获取深度

  • 前导入贴图,获取屏幕UV

  • 获取屏幕深度

  • 在计算模型深度

    使用 i.positionCS.z   获取齐次裁剪空间 Z值就是物体像素的深度。XY是物体像素的坐标。

使用模型深度减屏幕深度。增加一个控制深度边缘大小的值。

获取深度就得到了。

效果

扩展 齐次裁剪空间 | Homogeneous Clip Space

齐次裁剪空间(Homogeneous Clip Space)

positionCS.xyzw

positionCS.xy 是像素的位置坐标

positionCS.z 是像素的深度。

在轻量管线中,w分量恒为1。至于为什么要有这个w分量。

齐次空间W分量的意义,是处理向量(方向、法线等,w=0)和矢量(顶点w=1)时可以使用统一的4x4变换矩阵。Unity的内部的实现,没有遵照这一方式,在处理方向时都把4x4矩阵做了裁剪成为3x3矩阵忽略了W分量,或者把W分量用来存储其他数据来节省插值寄存器的使用。

实现Fresnel效果

  • 实现Fresnel的效果是 1 - NdotV的效果。

在顶点着色器阶段计算出法线和世界空间顶点位置信息。

  • 在片元着色器阶段我们计算出视角V

这里_RimPower是控制Fresnel的大小的,_Emiss是自发光控制强度

效果

问题:这俩个效果有什么区别

  • 深度获取的是这样的,不够圆滑,只是在和边缘接触的地方有渐变效果

  • Fresnel 是均匀的产生渐变。

  • 现在是把这俩种方式结合一下。

  • 效果

  • 这样和模型交接也会产生边缘效果。

  • 输入主贴图

效果

简单的护盾效果就实现了。


代码

优化效果

  • 准备一个需要的模型

增加流光

增加流光效果增加科技感。

  • 添加变量

  • 流光的颜色

    流光速度

    流光边缘

  • 在片元着色器阶段,计算流光,输出到颜色


  • 效果


增加顶点动画

  • 定义属性

上面是向量方向

下面是顶点动画时间

  • 顶点动画是计算顶点数据完在增加到顶点位置信息里。在输出到片元着色器。

_VectorF 是计算sin函数,后面乘0.5 + 0.5是把数值转换到 0 -1 都是正数。

SNormals 我们是想控制模型法线方向移动,所以对顶点法线处理,在乘一个Vector3类型的数据

SPosition  这里计算出对顶点法线处理后,模型空间的新的位置。

  • 在把这个位置增加到我们的模型顶点里传入到片元着色器。

完成,就可以看到顶点动画。

简单理解顶点动画是对模型顶点的计算,

  • 效果

增加法线扭曲

  • 上一章节学习到了法线扭曲,这次加入效果,这样还是使用_CameraOpaqueTexture 来实现。

  • 定义输入变量

  • 片元着色器阶段输入顶点控制法线

  • 顶点着色器阶段

  • 片元着色器阶段计算

  • 单独看一下效果


  • 和其他效果增加起来。


效果

  • 完成效果



  • 代码



总结

  • 在URP管线下获取深度和颜色数据都一样,这样比较简单。

  • 使用模型深度和屏幕深度计算出是否接触。

    这样方法也可以使用到粒子里,实现粒子和模型接触产生的边缘。

  • 顶点动画是在顶点着色器(Vertex Shader)阶段处理的过程,对顶点处理完在传入到片元着色器阶段。

    顶点着色器通常用于实现坐标变换,顶点空间变换,逐顶点光照计算


资料参考

草地的顶点动画实现风吹草动 - 知乎 (zhihu.com)

游戏特效模型分享 六边面护盾1 max制作方法_哔哩哔哩_bilibili

【中文字幕】U3d能量盾牌特效制作_哔哩哔哩_bilibili

URP | 屏幕深度制作护盾特效的评论 (共 条)

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