灵魂扫描线算法
比如要生成如上所示的掃描線,可以作用于任何網(wǎng)格體,我們用虛幻引擎的shader編輯器來(lái)實(shí)現(xiàn)這個(gè)GPU特效。為什么叫靈魂掃描線呢,因?yàn)檫@個(gè)掃描線是由內(nèi)而外的:從物體的外接球中心(外心)發(fā)射,直到外接球邊緣,勻速地掃描經(jīng)過(guò)的每個(gè)像素(原子),被掃射的像素們呈現(xiàn)反色,往復(fù)循環(huán),這就是靈魂掃描線的基本原理。所以我們需要以下輸入:
原子坐標(biāo):像素的世界坐標(biāo)(原子指網(wǎng)格體三角面上每個(gè)邏輯點(diǎn))
外心:包圍球中心
外接球半徑:包圍球半徑
時(shí)間攝動(dòng):時(shí)間參數(shù)
速度:掃描線運(yùn)動(dòng)速率(相對(duì)速率,相對(duì)于半徑)
寬度:掃描線的寬度(相對(duì)寬度,相對(duì)于半徑),半徑的占比
原色:物體的底色,需要根據(jù)此計(jì)算出反色(1-color)
首先我們要算出原子到球心的距離與半徑之比,由此按距離給所有原子分配0~1的值。
這樣子,掃描線的寬度和速度都和物體大小成正比。因?yàn)檩敵龅氖菤w一化的數(shù)值,我們使用fractional這個(gè)周期為1的函數(shù)。
二(三)選一函數(shù):If與Step
if和step是shader中常用的二選一函數(shù),相當(dāng)于C語(yǔ)言中的三元表達(dá)式(?),它們都是通過(guò)2個(gè)數(shù)的大小比較,進(jìn)行二選一。
step是階級(jí)函數(shù),返回0或1,因?yàn)镚PU中都是通過(guò)浮點(diǎn)數(shù)0.0和1.0來(lái)表示bool類型的,這和cpu不太一樣。
if函數(shù)則可以返回0和1以外的值,除此之外,if函數(shù)還可以通過(guò)”相等誤差“參數(shù)實(shí)現(xiàn)三選一,圖中的”Equals Threshold“的值控制著A==B的情況。
但是我們只需要在原色和反色之間進(jìn)行二選一,所以在上面的frac函數(shù)圖像中,作常函數(shù)Y=width與原frac相交,Y<width的部分才顯示反色。于是我們有:
其中1-x就是反色算法,A接入的是之前的frac函數(shù),width就是掃面線的相對(duì)寬度,base color是物體的底色(所以掃描線是材質(zhì)函數(shù),非材質(zhì))。整個(gè)shader如下:
調(diào)用方式示例:
下面展示一些demo:
總結(jié)
- 上一篇: PCB快速打样规范
- 下一篇: EC11编码器和单片机通信