#ifndef __EFFECTS_CCGRABBER_H__
#define __EFFECTS_CCGRABBER_H__
#include "CCConfiguration.h"
#include "cocoa/CCObject.h"
#include "CCGL.h"
NS_CC_BEGIN
class CCTexture2D;
/** FBO class that grabs(抓取) the the contents of the screen */
class CCGrabber : public CCObject
{
public:
CCGrabber(void);
~CCGrabber(void);
void grab(CCTexture2D *pTexture);
void beforeRender(CCTexture2D *pTexture);
void afterRender(CCTexture2D *pTexture);
protected:
GLuint m_FBO;
GLint m_oldFBO;
GLfloat m_oldClearColor[4];
};
NS_CC_END
#endif // __EFFECTS_CCGRABBER_H__
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.cpp
CCGrabber::CCGrabber(void)
: m_FBO(0)
, m_oldFBO(0)
{
memset(m_oldClearColor, 0, sizeof(m_oldClearColor));
// generate FBO
glGenFramebuffers(1, &m_FBO);
}
void CCGrabber::grab(CCTexture2D *pTexture)
{
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &m_oldFBO);
// bind
glBindFramebuffer(GL_FRAMEBUFFER, m_FBO);
// associate texture with FBO
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pTexture->getName(), 0);
// check if it worked (probably worth doing :) )
GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
{
CCAssert(0, "Frame Grabber: could not attach texture to framebuffer");
}
glBindFramebuffer(GL_FRAMEBUFFER, m_oldFBO);
}
void CCGrabber::beforeRender(CCTexture2D *pTexture)
{
CC_UNUSED_PARAM(pTexture);
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &m_oldFBO);
glBindFramebuffer(GL_FRAMEBUFFER, m_FBO);
// save clear color
glGetFloatv(GL_COLOR_CLEAR_VALUE, m_oldClearColor);
// BUG XXX: doesn't work with RGB565.
glClearColor(0, 0, 0, 0);
// BUG #631: To fix #631, uncomment the lines with #631
// Warning: But it CCGrabber won't work with 2 effects at the same time
// glClearColor(0.0f,0.0f,0.0f,1.0f); // #631
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// glColorMask(true, true, true, false); // #631
}
void CCGrabber::afterRender(cocos2d::CCTexture2D *pTexture)
{
CC_UNUSED_PARAM(pTexture);
glBindFramebuffer(GL_FRAMEBUFFER, m_oldFBO);
// glColorMask(true, true, true, true); // #631
// Restore clear color
glClearColor(m_oldClearColor[0], m_oldClearColor[1], m_oldClearColor[2], m_oldClearColor[3]);
}