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

目的
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)