cocos2d里面有个CCRenderTexture,用于将指定对象渲染到纹理。在unity3d里面也有同样的技术。
今天查阅了相关资料,再看了一下cocos2d的源码,发现他实际上用的是FBO(帧缓存对象)渲染到纹理技术,即我们可以为帧缓存关联一个纹理附件,然后将帧缓存里面的内容放到纹理附件里面。
在cocos2d里面使用步骤大致如下:
1 创建texture:初始化的时候生成一个空的texture。并指定纹理数据的宽和高。
2 创建FBO:用glGenFramebuffers生成帧缓存FBO framebuffer。
3 记录之前的FBO:glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_oldFBO);
4 关联texture到FBO:绑定刚才生成的framebuffer(glBindFramebuffer), 用glFramebufferTexture2D 将texture关联到FBO。(当然可以为FBO创建深度缓存,这部分没仔细看)
以下内容通过命令队列执行
5 推送命令绑定FBO:RenderTexture begin 渲染开始的时候再次使用glBindFramebuffer。指定渲染到渲染缓存。注意这部分是推送到render command queue里面执行的。
6 推送命令渲染物体:调用待渲染的物体的visit,将渲染命令推送到render。
7 执行渲染:利用render进行渲染,执行上面5、6条的命令。
8 恢复之前的FBO:RenderTexture end,渲染结束的时候,通过glBindFramebuffer(GL_FRAMEBUFFER, _oldFBO);绑定到老的FBO。
这样就通过帧缓存将东西渲染到了纹理。