天天看點

cocos2dx 離屏渲染

今天才發現 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 的效果, 也可以用它實作螢幕截屏,保留上一幀圖像等功能。

今天參考了這篇文章,才了解到 CCRenderTexture 的用法的

http://www.cocoachina.com/bbs/read.php?tid=237495

自己欠缺的是對  opengl FBO 真正的了解, 和對 shader 算法知識匮乏。

如果知識應用的話,利用這個方法,就可以在 cocos2dx 中寫出一些漂亮的效果了。

按照自己上面說的做法,在 cocos2dx 3.0裡面, 一旦給 render texture 增加自己寫的 shader 後 ,出現了繪制不出來的情況。

暫時還不知道問題出在哪,初步感覺是自己寫的 fragment shader 是存在錯誤的。。。但是還沒查明錯在哪裡。

還是應該多去學習 opengl 底層知識才能解決這種 bug.

繼續閱讀