cocos2d-x 從3.0開始引入了一種新的渲染機制,所有的opengl渲染**不再放到每乙個node的draw函式裡面,而是通過各種rendercommand封裝起來,然後新增到乙個渲染佇列裡面去,最後在每一幀結束時把所有的這些命令都渲染出來。過程如下圖所示:
引擎不再使用主線程,而是開闢新的執行緒對佇列中的任務統一進行渲染,這有助於並行性,利用多核處理器提公升渲染的效率。每個渲染任務都有個key值,渲染佇列依據key值排序,依據優先順序進行渲染。
具體key值的定義,可以閱讀這裡。
了解cocos2d-x的渲染機制後,用**實現自己想要渲染的圖形就變得容易了。首先是上節提到的rendercommand,他的作用是將渲染函式封裝到渲染佇列中去。cocos提供了
customcommand類(繼承自
rendercommand)來實現使用者自定義呼叫opengl命令。通過customcommand,我們就能繫結自己寫的opengl**函式了。但是,封裝之後,渲染指令並不會執行,這是因為我們還沒有向renderqueue傳送渲染指令。
cocos2d-x中node類定義了虛函式
virtual void visit(renderer *renderer, const mat4& parenttransform, uint32_t parentflags);來
遍歷所有子節點,並且迴圈遞迴得傳送它們的渲染指令。layer繼承自node,因此我們可以過載visit函式,使用customcommand來傳送自定義的渲染指令。
接下來就是定義自己的渲染函式(ondraw),使用opengl es 2.0來實現自己的圖形。
新建乙個測試工程,具體**如下:
標頭檔案
#include "cocos2d.h"
using_ns_cc;
class helloworld : public cocos2d::layer
;
原始檔:
bool helloworld::init()
//從cocos2d-x的shader快取中取出乙個帶有position和color頂點屬性的shader,然後傳給helloworld這個layer!!!
this->setglprogram(glprogramcache::getinstance()->getglprogram(glprogram::shader_name_position_color));
return true;
}void helloworld::visit(renderer* renderer, const mat4& parenttransform, uint32_t parentflags)
void helloworld::ondraw()
; //第三個點的座標
//指定每乙個頂點的顏色,顏色值是rgba格式的,取值範圍是0-1
float color = ; //第三個點的顏色, 藍色
//啟用名字為position和color的vertex attribute
gl::enablevertexattribs(gl::vertex_attrib_flag_position | gl::vertex_attrib_flag_color);
//分別給position和color指定資料來源
glvertexattribpointer(glprogram::vertex_attrib_position, 2, gl_float, gl_false, 0, vertercies);
glvertexattribpointer(glprogram::vertex_attrib_color, 4, gl_float, gl_false, 0, color);
//繪製三角形,所謂的draw call就是指這個函式呼叫
gldrawarrays(gl_********s, 0, 3);
//通知cocos2d-x 的renderer,讓它在合適的時候呼叫這些opengl命令
cc_increment_gl_drawn_batches_and_vertices(1, 3);
//如果出錯了,可以使用這個函式來獲取出錯資訊
check_gl_error_debug();
}
執行結果:
cocos2d x 學習筆記 一
最近有點閒,突然想嘗試搞搞手機遊戲方面的開發,於是下了個cocos2d x 2.2.6和 cocos2d x權威指南 先看書,翻了下目錄尼瑪16章。厄,對於這種工具框架類的學習,貌似我從來沒有按部就班慢慢學的習慣 照例,花了2,3小時看下大概概念,記錄下 1,背景知識,過 2,環境搭建,cocos2...
Cocos2d x 學習日記 一
csv被稱為 逗號分隔值 comma separated values,csv csv格式比較簡單,解碼使用字串的擷取和分析就可以完成,使用 stringf和 array等ref類,解析csv比較方便。string有如下函式 array componentsseparatedbystring con...
解析cocos2d test專案(一)
啊,我這個坑也開始接觸cocos2d遊戲引擎了,好了ok,廢話不多說 首先,拿來test專案我整個人是懵逼的,wtf?這他娘的什麼玩意,老子不學了。那麼多檔案,編譯就編譯老半天。算了,飯要一口一口吃。我後來發現cocos2d也是有個疑似main函式的玩意大概就是這樣。哦,天哪,我一看源 就頭疼。誒?...