图片变灰,采用shader就可以实现,
有2中方法,
1,像CCSprite一样create
2. 把CCSprite传进来,并把图片要不要变灰的flag传进来,具体实现看代码和后面的使用方法
-----------------------------------------
GraySprite.h
// // GraySprite.h // goddess // // Created by rekoo on 13-7-23. // // #ifndef __goddess__GraySprite__ #define __goddess__GraySprite__ #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC; USING_NS_CC_EXT; class GraySprite : public CCSprite { public: GraySprite(); ~GraySprite(); bool initWithTexture(CCTexture2D* texture,const CCRect& rect); void draw(); void initProgram(); void listenBackToForeground(CCObject *obj); static GraySprite* create(const char *pszFileName); }; #endif /* defined(__goddess__GraySprite__) */
GraySprite.cpp
// // GraySprite.cpp // goddess // // Created by rekoo on 13-7-23. // // // 用shader创建灰度图, 用法跟sprite一样 // lua用法: local sprite = GraySprite:create("pic.png") #include "GraySprite.h" GraySprite::GraySprite() { } GraySprite::~GraySprite() { } GraySprite* GraySprite::create(const char *pszFileName) { GraySprite* pRet = new GraySprite(); if (pRet && pRet->initWithFile(pszFileName)) { pRet->autorelease(); } else { CC_SAFE_DELETE(pRet); } return pRet; } void GraySprite::listenBackToForeground(CCObject *obj) { setShaderProgram(NULL); initProgram(); } bool GraySprite::initWithTexture(CCTexture2D* texture,const CCRect& rect) { if( CCSprite::initWithTexture(texture,rect) ) { CCSize s = getTexture()->getContentSizeInPixels(); this->initProgram(); return true; } return false; } void GraySprite::initProgram() { // GLchar * fragSource = (GLchar*) CCString::createWithContentsOfFile( // CCFileUtils::sharedFileUtils()->fullPathForFilename("Shaders/example_Blur.fsh").c_str())->getCString(); const GLchar * pfrag = "#ifdef GL_ES \n \ precision mediump float; \n \ #endif \n\ uniform sampler2D u_texture; \n \ varying vec2 v_texCoord; \n \ varying vec4 v_fragmentColor; \n \ void main(void) \n \ { \n \ float alpha = texture2D(u_texture,v_texCoord).a; \n \ float grey = dot(texture2D(u_texture,v_texCoord).rgb,vec3(0.299,0.587,0.114)); \n \ gl_FragColor = vec4(grey,grey,alpha); \n \ } "; CCGLProgram* pProgram = new CCGLProgram(); pProgram->initWithVertexShaderByteArray(ccPositionTextureColor_vert,pfrag); setShaderProgram(pProgram); pProgram->release(); CHECK_GL_ERROR_DEBUG(); getShaderProgram()->addAttribute(kCCAttributeNamePosition,kCCVertexAttrib_Position); getShaderProgram()->addAttribute(kCCAttributeNameColor,kCCVertexAttrib_Color); getShaderProgram()->addAttribute(kCCAttributeNameTexCoord,kCCVertexAttrib_TexCoords); CHECK_GL_ERROR_DEBUG(); getShaderProgram()->link(); CHECK_GL_ERROR_DEBUG(); getShaderProgram()->updateUniforms(); } void GraySprite::draw() { ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex ); ccBlendFunc blend = getBlendFunc(); ccGLBlendFunc(blend.src,blend.dst); getShaderProgram()->use(); getShaderProgram()->setUniformsForBuiltins(); ccGLBindTexture2D( getTexture()->getName()); // // Attributes // #define kQuadSize sizeof(m_sQuad.bl) long offset = (long)&m_sQuad; // vertex int diff = offsetof( ccV3F_C4B_T2F,vertices); glVertexAttribPointer(kCCVertexAttrib_Position,3,GL_FLOAT,GL_FALSE,kQuadSize,(void*) (offset + diff)); // texCoods diff = offsetof( ccV3F_C4B_T2F,texCoords); glVertexAttribPointer(kCCVertexAttrib_TexCoords,2,(void*)(offset + diff)); // color diff = offsetof( ccV3F_C4B_T2F,colors); glVertexAttribPointer(kCCVertexAttrib_Color,4,GL_UNSIGNED_BYTE,GL_TRUE,(void*)(offset + diff)); glDrawArrays(GL_TRIANGLE_STRIP,4); CC_INCREMENT_GL_DRAWS(1); }
--------------------------------
使用例子:
1. GraySprite * gs = GraySprite::create("01.png");
剩下跟CCSprite一样,设置位置,addChild等等
2. CCSprite * cs = CCSprite::create("02.png");
GraySprite::setGray(cs,1); //变灰
GraySprite::setGray(cs,0); //原色
-----------------------------
把GraySprte暴露出去,lua就可以调用,很方便