原文链接:UE4---科幻扫描线效果笔记
思路
- 根据 Z 轴生成 0-1 Mask 贴图
- 控制顶部顶点的世界位置偏移
- 抖动效果
- 屏幕空间条
- 菲涅尔和 CameraFade
- 输入不透明度
根据 Z 轴生成 0-1 Mask 贴图
将世界空间坐标转换为模型空间,只取 Z 通道, ObjectBounds 返回的是模型的边界,我们除以 Z 通道就可以得到模型从底部到顶点 [0-1] 的 Mask 遮罩
我的修正:如果是将世界空间坐标转换为模型空间,上面原文作者的图显然是错的,应该如下所示
然后再将变换到模型空间的 Z 通道从 [-1, 1] 变换为 [0, 1] 的范围,效果才如下所示
控制顶部顶点的世界位置偏移
生成的 Z 轴 Mask 遮罩是用于控制 WorldPositionOffset
同样将顶点的世界空间 Pos 转换到模型空间,并将位置进行归一化,只取 RG 通道,这个 RG 通道其实就是顶点在 XY 平面移动的方向
那么 Z 通道自然用于是 Z 轴方向上的移动
通过在这两个方向上的位移,我们可以实现 模型的压缩(激活全息) 和 顶部扩大(缩放半径),当 激活全息为 0 时是压扁状态,为 1 则是全息状态
抖动效果
通过 ScreenPosition 的屏幕 UV 将 V 轴缩放到 0-100,再 Floor,分成 100 个不同的矩形区域,这里为了方便展示,我设置为 0-10 区间,再缩放回 0-1 区间,可以看到整个屏幕给分成了若干个矩形区域,并不是根据模型来切分。
我们继续连接 MF_FloatNoise 节点,这个节点使用传入 Noise 种子和一个 2D 向量输出一个随机值,MF_FloatNoise 材质函数如下
得到一直在随机变化的矩形条
控制抖动 用于开关抖动效果,为 0 开启、为 1 关闭,在世界空间上进行一定的抖动偏移
结果如下
屏幕空间条
同样是利用 ScreenPosition 的 UV 进行操作,但是上面可以看到,随着摄像机的距离,映射在模型上面的 UV 区域是不会变化的,一直是以屏幕为标准。
这样根据摄像机与物体的距离来决定生成的 UV 条的数量,符合了我们的要求
菲涅尔和 CameraFade
菲涅尔 用于边缘的透明,CameraFade 用于靠近 Mesh 时透明
输入不透明度
将基于 屏幕空间的空间条 与 菲涅尔、CameraFade、激活全息 进行相结合,输入不透明度
用于网格的 Scifi 材质
网格的 Scifi 材质只要修改抖动,以及输入的不透明度,删除 CameraFade 即可