全息投影特效制作详解

全息投影制作详解

在这里插入图片描述

实现原理:

1.使用聚光灯的光强值切换模型的显示和消失,当光衰减为0时,模型完全可见,当光衰减为100%时,模型完全消失,光衰减值在0到100%间,则呈现模型渐变显示或消失。
2.使用双Pass处理半透明模型穿插的问题。
3.通过偏移屏幕的Y坐标来做噪波纹理的UV动画,模拟全息投影屏上的噪波效果(类似于电视机屏幕上的噪点和上下滚动的横条纹)。
4.使用菲尼尔制作模型边缘的流光效果。

算法详解:

1.聚光灯的衰减
在这里插入图片描述
WorldSpaceLightPos向量是float4类型数据,XYZ是光向量3个轴坐标,W是光源类型,0是平行光,1是点光源或者聚光灯,这里WorldSpaceLightPos节点的Type即为W分量。我们这里是用的聚光灯,所以Type等于1,1和衰减的乘积还是衰减本身,在经过Smoothstep的灰度遮罩处理,得到了一个光强衰减遮罩(衰减值其实是利用的灯光衰减贴图来模拟的,并非实时灯光衰减,从下面代码中可以很直观的看到底层的操作)。
代码中,由于聚光灯只能在前向叠加Pass(ForwardAdd)拿到衰减值(这和前向渲染规则有关),所以利用前向渲染的双Pass,刚好又可以同时处理半透模型穿插的问题(双Pass处理半透模型在第2条说明)。ForwardAdd的Pass中的灯光衰减判断代码如下:
在这里插入图片描述

2.双Pass解决半透模型穿插
造成半透明模型穿插的原因是:半透明必须关闭深度写入,所以对于一个结构复杂有前后穿插的模型来说,关闭深度写入意味着模型内部顶点的深度错乱。
解决办法:第一个pass写入深度,但不输出颜色。第二个Pass关闭深度写入,做半透明混合输出颜色。
ASE中双Pass步骤:
(1)新建一个shader,修改其Pass选项卡,如图
在这里插入图片描述
(2)取名,如图
在这里插入图片描述
(3)第二个Pass中调用,注意调用的路径和名字一定要正确
在这里插入图片描述
代码写法:

在这里插入图片描述
3.屏幕上滚动的横条纹算法
在这里插入图片描述
(1)屏幕Y坐标随时间偏移
这里的屏幕Y坐标按照常理来说是应该做齐次除法(除以W值)来得到真正的Y值的,但是因为图像连续且循环,所以并不一定要得到正确的Y坐标,因此直接传入Y坐标可以省去齐次除法的计算。
(2)横条纹算法
Tau是2PI的常量值,2PI为正弦函数的一个循环,即一白一黑循环滚动(1到-1,-1到1循环),所以乘以一个lineAmount标量可以控制条纹数量,最后用SmoothStep控制遮罩形状。
对应代码:
在这里插入图片描述
代码里是做了齐次除法的,出来效果一样,这也印证了上面的结论。

4.雪花点噪波算法
噪波纹理很多算法可以在网上找到,这里提供一个网址,有很多程序纹理算法源代码。
程序纹理地址https://docs.unity3d.com/Packages/[email protected]/manual/Procedural-Nodes.html
当然了如果有些朋友觉得代码麻烦,也可以直接用贴图采样(我觉得贴图麻烦,哈哈),效果是一样的,但是程序贴图会省很多资源。直接上算法代码:
在这里插入图片描述

5.菲涅尔反射
老生常谈的菲涅尔,想必大家已经烂熟于心了吧,求模型边缘遮罩算法的一剂老中药,套公式,直接盘它。
在这里插入图片描述
代码:
在这里插入图片描述

最后我们将上述效果混合在一起就得到了最终的全息投影效果。

发布了4 篇原创文章 · 获赞 13 · 访问量 2671

猜你喜欢

转载自blog.csdn.net/qq_42650859/article/details/104638526
今日推荐