您的位置:首页 > 移动开发 > Cocos引擎

探cocos2dx特效实现(effects),源码版本(2.2.3)

2014-08-28 13:27 896 查看
cocos2dx实现的特效非常多,粗略算了下差不多有22种,如果需要查看具体表现效果的话可以运行TestCpp的effects test。

cocos2dx特效渲染使用opengl的fbo技术。fbo全称frame buffer object,如vbo一样,是opengl的一种优化渲染技术,用于提高渲染性能,不同于vbo用于顶点属性,当启用fbo之后的渲染命令会作用于纹理、RBO中,只有撤销fbo之后才会渲染到帧缓存内,也就是说fbo相当于一个调整渲染目标的技术。当fbo渲染到纹理、RBO之后,可以直接使用那些对象(作用于纹理时可以直接使用渲染到的纹理,RBO对象可以通过glReadBuffer、glBlitFramebuffer进行拷贝)。当然这需要连接到可渲染的对象上才行,单独的fbo无法

产生作用。其应用场景大多是需要获得已经渲染了的内容,比如说显示镜子上影像。以前的做法是先渲染到缓存,然后读到内存中,形成一个纹理。这样镜子里的影像就可以当成一个纹理贴到镜子上。现在使用fbo之后省掉了这一系列麻烦的操作,直接渲染到纹理,再然后贴到镜子上。

cocos2dx里边实现特效的方式也使用了类似于实现镜子影像的原理,可以看到在ccnode的visit()渲染函数里边会优先判断是否启用了特效格子,如果启用了特效格子那么挂接到fbo(beforeDraw()),然后才开始渲染ccnode以及它的子节点,最后在afterDraw()才会绘制到帧缓存中。

模块相关类:

CCGrabber:

封装fbo使用的细节。

CCGridBase:

封装设置特效格子一系列基础参数的方法,包含有beforeDraw,afterDraw。

CCGrid3D:

封装实际渲染方法,跟随时间变动调整格子坐标的方法。

CCTiledGrid3d:

类似于CCGrid3D。

uml图:



使用方式:

CCNode *tempNode = CCNode::Create();

CCWave3D *tempAction = CCWave3D::Create(2.5f,CCSize(15,12),rand()%10,rand()%60);

tempNode->runAction(tempAction);

tempNode->addChild(CCSprite::Create("randomPirture.png"))

addChild(tempNode);

扩展:

模块相关类已经说明了具体类封装的功能,针对这些功能使用继承的方式添加修改就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐