cocos2dx 離屏渲染

2021-06-28 09:26:24 字數 1139 閱讀 8440

今天才發現 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...