上篇介紹了基礎,這篇先介紹下shadertools的封裝,為以後打好基礎。
注:這篇文章是基於cocos2dx的
文中有不懂的地方可去回顧上篇:《【步兵 shader】基礎篇》
首先介紹幾個類
glprogram //shaderprogram
glprogramcache//可以存放已經鏈結過的shaderprogram
glprogramstate//這個類是基於program的封裝,為了更方便的傳參
有了這幾個類就基本ok了,本身shader的難度就不是在這些地方,可能一直沒接觸,
所以會顯得很神秘。值得注意的一點,shaderprogram每次鏈結都是一次很大的開銷,
所以如果每次都建立鏈結的話,效率會非常低,所以一定要使用glprogramcache。
shadertools={}
local cls = shadertools --個人習慣,避免複製拷貝忘記改類名
stl = shadertools
--往glprogramcache新增編譯過的shaderprogram
local glprogramcache = cc.glprogramcache:getinstance()
function
cls.add(key, vert, frag)
if vert == nil and frag == nil then
--如果都沒著色器原始碼都沒傳,就去指定的位置找
vert = def.shader[key.."vs"]
frag = def.shader[key.."fs"]
endlocal glprogram = glprogramcache:getglprogram(key)
if glprogram == nil then
ifstring.match(vert,"%.vert") then
--有字尾則是檔案,不然是原始碼
glprogram = cc.glprogram:createwithfilenames(vert, frag)
else
glprogram = cc.glprogram:createwithbytearrays(vert, frag)
endif glprogram == nil then
return
end glprogram:link() --繫結著色器後,進行連線
glprogram:updateuniforms() --一些初始化操作
glprogramcache:addglprogram(glprogram, key) --添如快取
log.d("add "..key)
endend--對精靈設定shaderprogram
function
cls.set(sp, key, func)
local glprogram = glprogramcache:getglprogram(key)--從快取獲取
if glprogram then
local glprogramstate = cc.glprogramstate:getorcreatewithglprogram(glprogram)
func = func or def.shader[key.."func"]--如果func沒有,去指定地方找
_ = func and func(sp, glprogramstate)--這裡進行對shader傳參
sp:setglprogramstate(glprogramstate)--最後設定精靈的shader
endend
以上就是我對shader的封裝,雖然沒多少東西,但是用著很舒服。
我是如何初始化shader程式的呢?
--初始化
for k,v in pairs(def.shader) do
if type(v) == "string"
and tl.str.lower(k) == tl.str.lower(v) then
cls.add(v)
endend--使用
stl.set(sp, def.shader.***)
就這麼多,精簡不~ 驚喜不驚喜? 所以這就是我封裝的美學=、=
下邊用乙個,簡單的小例項結束這篇文章。
---------------grey_start---------------
def.shader
.grey = "grey"
def.shader
.greyvs = no_mvp
def.shader
.greyfs =
[[#ifdef gl_es
precision mediump float;
#endif
varying vec4 v_fragmentcolor;
varying vec2 v_texcoord;
void main(void)
]]---------------grey_ended---------------
使用的時候,只需要:
stl.set(dog, def.shader
.grey)
效果如圖:
還是這只可愛的「金色」小狗,雖然它已經變灰了,哈哈,好了,就這麼多。
see again~
之前 真愛無價,歡迎打賞~
步兵 shader 基礎篇
引用上文連線中的圖,渲染是乙個線性流程,他是在不停各個環節處理接收到的資料,然後輸出。首先建立一堆頂點資料,然後頂點著色器對處理這些資料,輸出給圖元裝配器連線成圖形,然後在輸出給幾何著色器可對圖形進行處理,再光柵化成畫素模式,輸出給片段著色器 計算每乙個畫素的最終顏色,最後混合疊加輸出到到螢幕上。值...
步兵 shader 掃光
掃光這個需求很常見,一是給介面新增些許生氣,二則是讓介面上的重點突出出來。往往 乙個靜止的介面中 突然有東西動了,就會很容易引起人的注意。掃光的實現方式有很多中,各有優缺點,可能你覺得shader實現是最高大上的,可能在美術眼裡,這種表現效果卻是最low的,所以還是一切以最終要的效果為基準來定製策略...
步兵 經驗篇 one step
前段時間羅永浩我發布會上出了個,這麼個東西,今天說的又更step有關,所以就引用一下。話說沒看過的,不如週末看看這個發布會,我覺得價值遠比手機大,春晚都沒這麼好看,哈哈。但是隨著工作經驗的增加,雖然我可以不用cocos的scene,但是還是來抽象出乙個scene類,用來做資源管理,遊戲中各個階段理好...