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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |