步兵 shader 封裝篇

2021-08-07 11:33:23 字數 2948 閱讀 7342

上篇介紹了基礎,這篇先介紹下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類,用來做資源管理,遊戲中各個階段理好...