欢迎转载,地址:http://blog.csdn.net/fylz1125/article/details/8631783
好吧,终于抽时间写这篇文章了。
手头上有很多人物行走图,技能特效图等,但这些图都有个纯黑色背景,怎么样将内容显示出来,让背景透明呢?前段时间搞了一下,感谢群里的童鞋们,提供了思路和方法。
这里用shader处理了像素,使黑色背景透明,直接上代码
ShaderSprite.h
- #ifndef__TestShader__ShaderSprite__
- #define__TestShader__ShaderSprite__
-
- #include"cocos2d.h"
- USING_NS_CC;
-
- classShaderSprite:publicCCSprite{
- public:
- staticShaderSprite*create(constchar*pszFileName);
- virtualboolinitWithTexture(CCTexture2D*pTexture,constCCRect&rect);
- virtualvoiddraw(void);
- };
- #endif/*defined(__TestShader__ShaderSprite__)*/
ShaderSprite.cpp
#include"ShaderSprite.h"
- staticCC_DLLconstGLchar*transparentshader=
- #include"tansparentshader.h"
- ShaderSprite*ShaderSprite::create(constchar*pszFileName)
- {
- ShaderSprite*pRet=newShaderSprite();
- if(pRet&&pRet->initWithFile(pszFileName)){
- pRet->autorelease();
- returnpRet;
- }
- else
- {
- deletepRet;
- pRet=NULL;
- returnNULL;
- }
- boolShaderSprite::initWithTexture(CCTexture2D*pTexture,constCCRect&rect)
- do{
-
- CC_BREAK_IF(!CCSprite::initWithTexture(pTexture,rect));
-
- m_pShaderProgram=newCCGLProgram();
- m_pShaderProgram->initWithVertexShaderByteArray(ccPositionTextureA8Color_vert,transparentshader);
- CHECK_GL_ERROR_DEBUG();
- //启用顶点着色器的attribute变量,坐标、纹理坐标、颜色
- m_pShaderProgram->addAttribute(kCCAttributeNamePosition,kCCVertexAttrib_Position);
- m_pShaderProgram->addAttribute(kCCAttributeNameColor,kCCVertexAttrib_Color);
- m_pShaderProgram->addAttribute(kCCAttributeNameTexCoord,kCCVertexAttrib_TexCoords);
- CHECK_GL_ERROR_DEBUG();
- //自定义着色器链接
- m_pShaderProgram->link();
- //设置移动、缩放、旋转矩阵
- m_pShaderProgram->updateUniforms();
- returntrue;
- }while(0);
- returnfalse;
- voidShaderSprite::draw(void)
- //CCLog("overridedraw!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
- CC_PROFILER_START_CATEGORY(kCCProfilerCategorySprite,"CCSprite-draw");
- CCAssert(!m_pobBatchNode,"IfCCSpriteisbeingrenderedbyCCSpriteBatchNode,CCSprite#drawSHOULDNOTbecalled");
- CC_NODE_DRAW_SETUP();
- //
- //启用attributes变量输入,顶点坐标,纹理坐标,颜色
- ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex);
- ccGLBlendFunc(m_sBlendFunc.src,m_sBlendFunc.dst);
- m_pShaderProgram->use();
- m_pShaderProgram->setUniformsForBuiltins();
- //绑定纹理到纹理槽0
- ccGLBindTexture2D(m_pobTexture->getName());
- #definekQuadSizesizeof(m_sQuad.bl)
- longoffset=(long)&m_sQuad;
- //vertex
- intdiff=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,0); background-color:inherit">//color
- glVertexAttribPointer(kCCVertexAttrib_Color,4,GL_UNSIGNED_BYTE,GL_TRUE,153); list-style:decimal-leading-zero outside; color:inherit; line-height:20px; margin:0px!important; padding:0px 3px 0px 10px!important"> glDrawArrays(GL_TRIANGLE_STRIP,4);
- CC_INCREMENT_GL_DRAWS(1);
- CC_PROFILER_STOP_CATEGORY(kCCProfilerCategorySprite,"CCSprite-draw");
- }
片段着色器代码
tansparentshader.h
"n
- #ifdefGL_ESn
- precisionlowpfloat;n
- #endifn
- varyingvec4v_fragmentColor;n
- varyingvec2v_texCoord;n
- uniformsampler2Du_texture;n
- voidmain()n
- {n
- floatratio=0.0;n
- vec4texColor=texture2D(u_texture,v_texCoord);n
- ratio=texColor[0]>texColor[1]?(texColor[0]>texColor[2]?texColor[0]:texColor[2]):(texColor[1]>texColor[2]?texColor[1]:texColor[2]);n
- if(ratio!=0.0)n
- {n
- texColor[0]=texColor[0]/ratio;n
- texColor[1]=texColor[1]/ratio;n
- texColor[2]=texColor[2]/ratio;n
- texColor[3]=ratio;n
- }n
- elsen
- texColor[3]=0.0;n
- gl_FragColor=v_fragmentColor*texColor;n
- }";
注意shader编程没有隐士数据类型转换,所以都显示为float了。
然后ratio是指在rgb中找最大的,如果ratio为0直接将alpha设为0,否则alpha设为ratio,然后各rgb除以ratio,这里是为了做渐变,否则变化太生硬。
上图:
好了,上面两张图是一样的。只是屏幕背景一个是白色,一个是黑色。图片背景透明了。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|