步兵 shader 掃光

2021-08-08 12:03:09 字數 3145 閱讀 3596

掃光這個需求很常見,一是給介面新增些許生氣,二則是讓介面上的重點突出出來。

往往 乙個靜止的介面中 突然有東西動了,就會很容易引起人的注意。

掃光的實現方式有很多中,各有優缺點,可能你覺得shader實現是最高大上的,可能在美術眼裡,

這種表現效果卻是最low的,所以還是一切以最終要的效果為基準來定製策略。

幀動畫【spine或其他】

優點:效果豐富、程式使用簡單

缺點:幀數多資源大,占用記憶體多,每個不同形狀要特效

單張+裁剪+疊加模式

優點:顏色和掃光形狀替換簡單、且掃光邊緣過度自然、無視形狀

缺點:不同效果需要不同、且使用時要指定裁剪和掃光略微複雜

ps:我目前用的是這種用的較多,最大的乙個特點就是他是通過的移動來掃光的,

所以可以通過相對位置計算,不同控制項的起始位置重合,一起移動,從而實現跨空間掃光的效果。

這是個很cool的效果,有機會你們可以試試。

因為shader的核心是利用直線方程的移動,已經計算兩條直線方程的距離來實現。

所以邊緣自然是直線,所以沒有方案2中的美術來控制行轉和透明度的效果好,

但**效果由於是計算出來的所以也有它的獨到之處。

從左往右掃

從上往下掃

看也看過了,接下來重點來了!!!

上邊也說了,核心就是直線方程,至於**中看不懂的公式請自行查詢。

a/b 主要控制斜率, dx、dy 主要控制移動速度。

radius是控制直線的距離,shinefactor則控制**度。

下邊為原始碼,至於使用方式,請結合前文中的shadertools。

見前文:【步兵 shader】封裝篇

---------------flash_start---------------

def.shader.flashfunc = function

(sp, state)

if state.__params then

for k,v in

pairs(state.__params) do

state:setuniformfloat(k,v)

endelse

state:setuniformfloat("a", 1.0)

state:setuniformfloat("b", 0.5)

state:setuniformfloat("dx", 1)

state:setuniformfloat("dy", 0)

state:setuniformfloat("radius", 0.25)

state:setuniformfloat("shinefactor", 1.75)

endsp:registerscripthandler(function

(state)

if state == "cleanup"

then

gm.scheduler:unschedulescriptentry(sp._shader_update_id)

endend)

local tt = 0

local

function

shader_logic

(dt)

tt = tt + dt

tt = tt % 5

state:setuniformfloat("time", tt)

state:setuniformfloat("opacity", sp:getopacity()/255)

endsp._shader_update_id = gm.scheduler:schedulescriptfunc(shader_logic, 1/60, false)

end-- 初始位置直線方程 ax+by=0

-- dx, dy 每秒直線移動位移

-- radius 半徑

-- shinefactor 亮度增加倍數

def.shader.flashfs =

[[#ifdef gl_es

precision mediump float;

#endif

varying vec4 v_fragmentcolor;

varying vec2 v_texcoord;

uniform float time;

uniform float opacity;

uniform float a,b;

uniform float dx,dy;

uniform float radius;

uniform float shinefactor;

void main(void)

else

gl_fragcolor.w = c.w * opacity;}]]

---------------frost_ended---------------

使用方法:

stl.set(dog.show

.model, def.shader

.flash) --預設橫掃

--自定義引數

stl.set(dog.show

.model, def.shader

.flash, function (sp, state)

state.__params =

def.shader

.flashfunc(sp, state)

end)

shader日常開發中用的不多,但這個功能依然為不常之中的最常,值得學習。

我也是網上臨摹,然後封裝了一下,然後、、眾萌新可以拿去裝逼了,不過直接搬運之前,

希望能學習幾分**或說封裝的技巧,本人實戰派,如果講的不夠精彩還望見諒,哈哈哈哈~

好了就這麼多!(ps:雖然從來無人打賞=、=)

see again~

之前 真愛無價,歡迎打賞~

步兵 shader 基礎篇

引用上文連線中的圖,渲染是乙個線性流程,他是在不停各個環節處理接收到的資料,然後輸出。首先建立一堆頂點資料,然後頂點著色器對處理這些資料,輸出給圖元裝配器連線成圖形,然後在輸出給幾何著色器可對圖形進行處理,再光柵化成畫素模式,輸出給片段著色器 計算每乙個畫素的最終顏色,最後混合疊加輸出到到螢幕上。值...

步兵 shader 封裝篇

上篇介紹了基礎,這篇先介紹下shadertools的封裝,為以後打好基礎。注 這篇文章是基於cocos2dx的 文中有不懂的地方可去回顧上篇 步兵 shader 基礎篇 首先介紹幾個類 glprogram shaderprogram glprogramcache 可以存放已經鏈結過的shaderpr...

步兵 經驗篇 one step

前段時間羅永浩我發布會上出了個,這麼個東西,今天說的又更step有關,所以就引用一下。話說沒看過的,不如週末看看這個發布會,我覺得價值遠比手機大,春晚都沒這麼好看,哈哈。但是隨著工作經驗的增加,雖然我可以不用cocos的scene,但是還是來抽象出乙個scene類,用來做資源管理,遊戲中各個階段理好...