掃光這個需求很常見,一是給介面新增些許生氣,二則是讓介面上的重點突出出來。
往往 乙個靜止的介面中 突然有東西動了,就會很容易引起人的注意。
掃光的實現方式有很多中,各有優缺點,可能你覺得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類,用來做資源管理,遊戲中各個階段理好...