今天才發(fā)現(xiàn) cocos2dx 有一個(gè)類叫做 CCRenderTexture,封裝了 opengl render to texture 的 細(xì)節(jié)。 這個(gè)類的是采用 FBO ,把圖像渲染到 自己新建的 frame buffer 來實(shí)現(xiàn)的。 如果寫一個(gè) shader ,比如讓圖像變成灰色,如果只給一個(gè) CCSprite setShaderProgram()
今天才發(fā)現(xiàn) cocos2dx 有一個(gè)類叫做 CCRenderTexture,封裝了 opengl render to texture 的 細(xì)節(jié)。
這個(gè)類的是采用 FBO ,把圖像渲染到 自己新建的 frame buffer 來實(shí)現(xiàn)的。
如果寫一個(gè) shader ,比如讓圖像變成灰色,如果只給一個(gè) CCSprite setShaderProgram()的話,只能讓單獨(dú)的 Sprite 變成灰色,
但是如果想讓整個(gè)游戲場景變成灰色,或者讓其中一部分變成灰色,就需要使用 FBO 離屏渲染技術(shù),把一些渲染的內(nèi)容放到一個(gè) FBO上,
然后繪制完成后,再放回到 最終的 frame buffer 中。
cocos2dx 封裝了這些操作,具體用法是
1.實(shí)例化一個(gè) CCRenderTexture* m_pRtt;
2.初始化時(shí)候,設(shè)置它的大小 m_pRtt = CCRenderTexture::create( width,height );
3.在 m_pRtt->begin() 和 m_pRtt->end() 之間,執(zhí)行 opengl 繪制指令。
比如在當(dāng)前場景的 update() 中,這樣寫:
m_pRtt->begin();
this->visit();
m_pRtt->end();
這樣整個(gè)場景就繪制到了 m_pRtt 這個(gè) RenderTexture 中
4. 如果需要給整個(gè)場景設(shè)置 shader ,則調(diào)用
m_pRtt->getSprite() ,給這個(gè) Sprite setShaderProgram()即可。
這樣,就可以實(shí)現(xiàn) 全屏高斯模糊 ,全屏變灰等 shader 的效果, 也可以用它實(shí)現(xiàn)屏幕截屏,保留上一幀圖像等功能。
今天參考了這篇文章,才了解到 CCRenderTexture 的用法的
http://www.cocoachina.com/bbs/read.php?tid=237495
自己欠缺的是對(duì) opengl FBO 真正的理解, 和對(duì) shader 算法知識(shí)匱乏。
如果知識(shí)應(yīng)用的話,利用這個(gè)方法,就可以在 cocos2dx 中寫出一些漂亮的效果了。
按照自己上面說的做法,在 cocos2dx 3.0里面, 一旦給 render texture 增加自己寫的 shader 后 ,出現(xiàn)了繪制不出來的情況。
暫時(shí)還不知道問題出在哪,初步感覺是自己寫的 fragment shader 是存在錯(cuò)誤的。。但是還沒查明錯(cuò)在哪里。
還是應(yīng)該多去學(xué)習(xí) opengl 底層知識(shí)才能解決這種 bug.
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com