今天才發現 cocos2dx 有乙個類叫做 ccrendertexture,封裝了 opengl render to texture 的 細節。
這個類的是採用 fbo ,把影象渲染到 自己新建的 frame buffer 來實現的。
如果寫乙個 shader ,比如讓影象變成灰色,如果只給乙個 ccsprite setshaderprogram()的話,只能讓單獨的 sprite 變成灰色,
但是如果想讓整個遊戲場景變成灰色,或者讓其中一部分變成灰色,就需要使用 fbo 離屏渲染技術,把一些渲染的內容放到乙個 fbo上,
然後繪製完成後,再放回到 最終的 frame buffer 中。
cocos2dx 封裝了這些操作,具體用法是
1.例項化乙個 ccrendertexture* m_prtt;
2.初始化時候,設定它的大小 m_prtt = ccrendertexture::create( width,height );
3.在 m_prtt->begin() 和 m_prtt->end() 之間,執行 opengl 繪製指令。
比如在當前場景的 update() 中,這樣寫:
m_prtt->begin();
this->visit();
m_prtt->end();
這樣整個場景就繪製到了 m_prtt 這個 rendertexture 中
4. 如果需要給整個場景設定 shader ,則呼叫
m_prtt->getsprite() ,給這個 sprite setshaderprogram()即可。
這樣,就可以實現 全屏高斯模糊 ,全屏變灰等 shader 的效果, 也可以用它實現螢幕截圖,保留上一幀影象等功能。
自己欠缺的是對 opengl fbo 真正的理解, 和對 shader 演算法知識匱乏。
如果知識應用的話,利用這個方法,就可以在 cocos2dx 中寫出一些漂亮的效果了。
按照自己上面說的做法,在 cocos2dx 3.0裡面, 一旦給 render texture 增加自己寫的 shader 後 ,出現了繪製不出來的情況。
暫時還不知道問題出在哪,初步感覺是自己寫的 fragment shader 是存在錯誤的。。。但是還沒查明錯在**。
還是應該多去學習 opengl 底層知識才能解決這種 bug.
cocos2dx渲染流程
二 mainloop drawscene當中統計deltatime,再呼叫排程管理器update,opengl clearbuffer,設定渲染檢視矩陣,投影矩陣和紋理,呼叫當前場景visit 遞迴呼叫子節點 呼叫opengl渲染 前後臺緩衝區交換 呼叫統計函式,呼叫自動釋放池的pop。三 ccme...
Cocos2d x 文字渲染
文字渲染 cclabelatlas cclabelbmfont cclabelttf類都是繼承 cclabelprotocol類,即能夠使用系統字,也能夠自己定義渲染字型。cclabelatlas類使用作為文字的一種方式,通過直接定義 cclabelatlas label0 cclabelatlas...
cocos2dX 文字的渲染
1 建立一段文字 create函式的三個引數分別為 文字內容 字型和字型大小 cclabelttf font cclabelttf create hello world 微軟雅黑 48 2 獲取文字的尺寸 font getcontentsize 返回的是乙個ccsize型別的值 該值有兩個屬性wid...