cocos2dx 图片变灰及正常显示实现(lua可以调用)
发布时间:2020-12-14 19:03:55 所属栏目:百科 来源:网络整理
导读:图片 变灰,采用shader就 可以实现 , 有2中方法, 1,像CCSprite一样create 2. 把CCSprite传进来,并把 图片 要不要变灰的flag传进来,具体 实现 看代码和后面的使用方法 ----------------------------------------- GraySprite.h //// GraySprite.h// goddess///
图片变灰,采用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就可以调用,很方便 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |