drawnode整個結(jié)構(gòu)如下:
和cocos風(fēng)格一樣,二段式構(gòu)建方法,create->init撇吞,create函數(shù)new初始化對象時,初始化如下:
初始化vao礁叔、vbo牍颈,定點相關(guān)buffer和臟標(biāo)記,還有混合模式
看看混合模式的定義:
定義了幾種混合模式琅关,一般用透明效果參數(shù)設(shè)置是 (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 即上面定義的 ALPHA_NON_PREMULTIPLIED煮岁,待會會實驗和ALPHA_PREMULTIPLIED的區(qū)別(一般是用的預(yù)乘混合方式,不預(yù)乘的稱為straight涣易,主要是在兩種顏色縮小可能會出現(xiàn)的不正確的現(xiàn)象)
再看看在init中初始化了什么
設(shè)置混合模式画机,設(shè)置shader,下面是使用的shader
3個屬性新症,頂點步氏、紋理坐標(biāo)和顏色,頂點顏色和紋理坐標(biāo)兩個易變量徒爹。
step(edge, x):如果x<edge返回0否則返回1 ? length()計算向量長度
對于gl_fragcolor的輸出不懂(已解決荚醒,紋理坐標(biāo)長度大于1的step返回0,所以顏色為黑色隆嗅,紋理坐標(biāo)小于1的step返回1界阁,所以顏色為采樣值),但是點的4個角為什么是透明的胖喳,還是不清楚)(原來是返回0的時候會把透明度也設(shè)為0E萸!丽焊!而根據(jù)混合模式较剃,會把顏色混合為dst的顏色!<冀 V馗丁!Y旃浴H返妗弓颈!
)
先分析后面,設(shè)置頂點buffer大小
根據(jù)平臺是否支持開啟vao删掀,有些pc不支持翔冀,有些android支持得不好,android默認(rèn)關(guān)閉
然后再使用vbo分別綁定頂點坐標(biāo)披泪,紋理坐標(biāo)和顏色的值
2纤子、下面開始測試
1> drawDot
畫點,提供位置款票、半徑和顏色
初始化定點數(shù)據(jù)控硼,并把數(shù)據(jù)存在兩個三角形結(jié)構(gòu)體中,三角形結(jié)構(gòu)體即3個頂點的結(jié)構(gòu)體艾少,并增加buffer的大小
由此也可知卡乾,點是由兩個三角形繪制完成,不明白4個圓角如何不顯示的(解決)
將此node添加到場景中后缚够,遍歷后會調(diào)用draw
使用的自定義繪制幔妨,并設(shè)置回調(diào)方法為onDraw
首先得到shader,使用shader谍椅,然后設(shè)置內(nèi)置的uniform
shader在創(chuàng)建的時候會把全部uiform的地址保存在一個數(shù)組中误堡,以方便以后的使用,如下:并且會根據(jù)是否有某些uiform來設(shè)置flag標(biāo)記雏吭,這里需要注意锁施,因為cocos封裝了compileshader,使得所有需要的uniform都自動加入shader代碼中杖们,但是如果代碼中沒有使用的uniform沾谜,會被自動忽略掉,所以標(biāo)記會是某些uniform沒有胀莹。
根據(jù)uniform的類型給uniform賦值,這里有個疑問婚温,在具體shader中描焰,雖然看到了mvpMatrxi矩陣,但是并沒有看到其定義栅螟,難道是程序預(yù)先在哪里定義了荆秦,還是uniform不需要定義?(解決力图,glprogram中封裝了compileshader步绸,使shader字符串加入了一些uniform的定義,如下)
回到onDraw
然后設(shè)置混合吃媒,最后就是綁定vbo或者綁定vao瓤介,然后繪制即可吕喘!
3、drawSegment
相比drawDot刑桑,用了8個頂點氯质,組合了6個3角形,不明白為什么要這樣做祠斧,兩個三角形不就行了嗎
注意:drawNode支持批繪制闻察,將所有頂點數(shù)據(jù)都放在buffer中!然后一次繪制琢锋,比如
3個圖形只調(diào)用一次drawcall 實現(xiàn)批繪制