比如要生成如上所示的扫描线,可以作用于任何网格体,我们用虚幻引擎的shader编辑器来实现这个GPU特效。为什么叫灵魂扫描线呢,因为这个扫描线是由内而外的:从物体的外接球中心(外心)发射,直到外接球边缘,匀速地扫描经过的每个像素(原子),被扫射的像素们呈现反色,往复循环,这就是灵魂扫描线的基本原理。所以我们需要以下输入:
首先我们要算出原子到球心的距离与半径之比,由此按距离给所有原子分配0~1的值。
这样子,扫描线的宽度和速度都和物体大小成正比。因为输出的是归一化的数值,我们使用fractional这个周期为1的函数。
二(三)选一函数:If与Step
if和step是shader中常用的二选一函数,相当于C语言中的三元表达式(?),它们都是通过2个数的大小比较,进行二选一。
但是我们只需要在原色和反色之间进行二选一,所以在上面的frac函数图像中,作常函数Y=width与原frac相交,Y<width的部分才显示反色。于是我们有:
其中1-x就是反色算法,A接入的是之前的frac函数,width就是扫面线的相对宽度,base color是物体的底色(所以扫描线是材质函数,非材质)。整个shader如下:
调用方式示例:
下面展示一些demo: