您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 DiGiToTo 于 2022-4-11 05:08 编辑
话不多说直接开始详细解析!效果分析从游戏或者上面的效果图中不难看出,大锤(莱茵哈特)的护盾大概有4中效果拼接而成:边缘高光、移动的镂空线条、若隐若现的蜂窝、与其他场景物体交互产生的高光条。OK,分析结束我们直接开始解析。 若隐若现的蜂窝首先从最简单的蜂窝开始,这里直接使用一张蜂窝装的贴图当做护盾的基本贴图,并且通过这张贴图我们实现蜂窝呼吸的效果。
基本贴图
呼吸灯效果的实现非常简单,仅需要一个sin函数就能实现0→1→0的循环,我们只需要将其应用在上面的基本贴图之中。 首先我们首先要做的是确保模型的中点在体积中心点,这点我们后面需要用。首先我们从游戏或者上面效果图可以看出。蜂窝的呼吸效果从模型的正中间水平向两边扩散.这时我们就可以借助模型本地空间实现从中间向两边移动。
因为上面强调过,使用的模型需要中心点在体积的中心,所以单一X方向上-模型本地空间的正中间为0,左边和右边分别是小于0 和 大于0,这一点需要理解! 这时我们只要对x方向上取绝对值(镜像),再加上时间并应用到sin函数中,就可以得到一个镜像的移动且有过渡效果的基底。 OK,基底得到后我们就可以在上面应用基本贴图和颜色,当然各种参数可以自定义。例如移动速度,光带的大小……,这一部分个人感觉效果相差不大,所以直接写死了。下面放出代码和参数参考
移动的镂空线条这部分和上面的思路差不多一样,不过不同的是镂空线条的移动是从中心以棱形移动。这时候我们就需要再次回到模型本身上面。
和上面的思路差不多一样,不过这次是升级到二维空间。OK,这样只需要限定这个棱形范围和调节各种参数就可以了。(当然可以把镂空贴图直接放在基本贴图的一个颜色通道中从而节约性能只采样一张贴图[有点懒了就没整]) 代码基本实现思路就是将hollowedFlow计算出的结果用于镂空贴图的遮罩。这样效果就出来了。 边缘高光其实做边缘自发光有很多方案,比如菲聂耳反射、算法、贴图。我们这里使用算法,因为护盾属于双面体,使用菲聂耳反射多多少少有些问题。 做发很简单,还是上面经常用到的点,对模型本地坐标的两个方向取绝对值再通过各种参数调成下面的基底效果
如果觉得较暗可以直接乘上相应的系数拉高亮度,具体算法可以参照上述代码部分。 中间遮罩效果的原理与边缘高光非常相似,这里就不多说了直接上参考代码和效果图
遮罩效果的目的当然是增大玩家视野,这部分还是非常重要的! 与其他场景物体交互产生的高光条OK,到了相对比较麻烦的地方。 首先我们可以在 Windows-Analysis-FramDebugger中查看当前场景的深度信息。
每次Unity在渲染场景时,会将不透明物体的深度信息保存成一张贴图。我们就可以利用这张贴图来玩转深度信息。
上述代码可以直接书写来获取当前场景的深度信息,当然我们的护盾需要做成半透明物体,所以在在深度信息贴图中没有办法看见护盾的深度信息。 那么不透明物体的深度信息如何获取呢?非常简单,只需要得到模型顶点在观察空间坐标系中的Z值。
因为在观察空间坐标系下,Z值就是顶点坐标到我们相机的距离。这个距离当然可以代表深度信息。 场景的深度信息和模型的深度信息我们都获取到了,两者相减可以得到深度信息的差值。前提是我们需要将深度信息转到人眼观察的线性空间中
我们需要注意最后一行公式,明明前面说相减为什么要想加。这需要知道观察空间是右手坐标系,而Unity的世界空间是左手坐标系。 Z轴是反向的。所以这里直接想加。 Ok类似上面的效果图,我们得到一个基底部分。只需对得到的基底效果取反并添加额外的参数就可以了。
简简单单的护盾效果由4部分组成。本次案例的重点是利用模型本地空间的原点实现了多种效果。减少消耗提高性能。其实这次案例还有优化点。就是将贴图的一个通道替换成镂空贴图,这部分需要在PS中进行 OK,这样我们性能最大化 仅仅两个贴图[其实只有一个,因为采样了场景深度信息]+一些算法实现大锤护盾效果。整体来讲效果非常不错。
|