欢迎转载,地址:http://blog.csdn.net/fylz1125/article/details/8631783

好吧,终于抽时间写这篇文章了。

手头上有很多人物行走图,技能特效图等,但这些图都有个纯黑色背景,怎么样将内容显示出来,让背景透明呢?前段时间搞了一下,感谢群里的童鞋们,提供了思路和方法。

这里用shader处理了像素,使黑色背景透明,直接上代码

ShaderSprite.h

[cpp] view plaincopyprint?
  1. #ifndef __TestShader__ShaderSprite__
  2. #define __TestShader__ShaderSprite__
  3. #include "cocos2d.h"
  4. USING_NS_CC;
  5. class ShaderSprite : public CCSprite {
  6. public:
  7. static ShaderSprite* create(const char* pszFileName);
  8. virtual bool initWithTexture(CCTexture2D *pTexture, const CCRect& rect);
  9. virtual void draw(void);
  10. };
  11. #endif /* defined(__TestShader__ShaderSprite__) */

ShaderSprite.cpp

[cpp] view plaincopyprint?
  1. #include "ShaderSprite.h"
  2. static CC_DLL const GLchar *transparentshader =
  3. #include "tansparentshader.h"
  4. ShaderSprite* ShaderSprite::create(const char *pszFileName)
  5. {
  6. ShaderSprite *pRet = new ShaderSprite();
  7. if (pRet && pRet->initWithFile(pszFileName)) {
  8. pRet->autorelease();
  9. return pRet;
  10. }
  11. else
  12. {
  13. delete pRet;
  14. pRet = NULL;
  15. return NULL;
  16. }
  17. }
  18. bool ShaderSprite::initWithTexture(CCTexture2D *pTexture, const CCRect& rect)
  19. {
  20. do{
  21. //        CCLog("override initWithTexture!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
  22. CC_BREAK_IF(!CCSprite::initWithTexture(pTexture, rect));
  23. // 加载顶点着色器和片元着色器
  24. m_pShaderProgram = new  CCGLProgram();
  25. m_pShaderProgram ->initWithVertexShaderByteArray(ccPositionTextureA8Color_vert, transparentshader);
  26. CHECK_GL_ERROR_DEBUG();
  27. // 启用顶点着色器的attribute变量,坐标、纹理坐标、颜色
  28. m_pShaderProgram->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);
  29. m_pShaderProgram->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color);
  30. m_pShaderProgram->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);
  31. CHECK_GL_ERROR_DEBUG();
  32. // 自定义着色器链接
  33. m_pShaderProgram->link();
  34. CHECK_GL_ERROR_DEBUG();
  35. // 设置移动、缩放、旋转矩阵
  36. m_pShaderProgram->updateUniforms();
  37. CHECK_GL_ERROR_DEBUG();
  38. return true;
  39. }while(0);
  40. return false;
  41. }
  42. void ShaderSprite::draw(void)
  43. {
  44. //    CCLog("override draw!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
  45. CC_PROFILER_START_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw");
  46. CCAssert(!m_pobBatchNode, "If CCSprite is being rendered by CCSpriteBatchNode, CCSprite#draw SHOULD NOT be called");
  47. CC_NODE_DRAW_SETUP();
  48. //
  49. // 启用attributes变量输入,顶点坐标,纹理坐标,颜色
  50. //
  51. ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex );
  52. ccGLBlendFunc(m_sBlendFunc.src, m_sBlendFunc.dst);
  53. m_pShaderProgram->use();
  54. m_pShaderProgram->setUniformsForBuiltins();
  55. // 绑定纹理到纹理槽0
  56. ccGLBindTexture2D(m_pobTexture->getName());
  57. #define kQuadSize sizeof(m_sQuad.bl)
  58. long offset = (long)&m_sQuad;
  59. // vertex
  60. int diff = offsetof( ccV3F_C4B_T2F, vertices);
  61. glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff));
  62. // texCoods
  63. diff = offsetof( ccV3F_C4B_T2F, texCoords);
  64. glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));
  65. // color
  66. diff = offsetof( ccV3F_C4B_T2F, colors);
  67. glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff));
  68. glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  69. CHECK_GL_ERROR_DEBUG();
  70. CC_INCREMENT_GL_DRAWS(1);
  71. CC_PROFILER_STOP_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw");
  72. }

片段着色器代码

tansparentshader.h

[cpp] view plaincopyprint?
  1. "                                                       \n\
  2. #ifdef GL_ES                                            \n\
  3. precision lowp float;                                   \n\
  4. #endif                                                  \n\
  5. varying vec4 v_fragmentColor;                           \n\
  6. varying vec2 v_texCoord;                                \n\
  7. uniform sampler2D u_texture;                            \n\
  8. void main()                                             \n\
  9. {                                                       \n\
  10. float ratio=0.0;                                    \n\
  11. vec4 texColor = texture2D(u_texture, v_texCoord);   \n\
  12. ratio = texColor[0] > texColor[1]?(texColor[0] > texColor[2] ? texColor[0] : texColor[2]) :(texColor[1] > texColor[2]? texColor[1] : texColor[2]);                                      \n\
  13. if (ratio != 0.0)                                          \n\
  14. {                                                          \n\
  15. texColor[0] = texColor[0] /  ratio;                    \n\
  16. texColor[1] = texColor[1] /  ratio;                    \n\
  17. texColor[2] = texColor[2] /  ratio;                    \n\
  18. texColor[3] = ratio;                                   \n\
  19. }                                                          \n\
  20. else                                                       \n\
  21. {                                                          \n\
  22. texColor[3] = 0.0;                                     \n\
  23. }                                                          \n\
  24. gl_FragColor = v_fragmentColor*texColor;                   \n\
  25. }";

注意shader编程没有隐士数据类型转换,所以都显示为float了。

然后ratio是指在rgb中找最大的,如果ratio为0直接将alpha设为0,否则alpha设为ratio,然后各rgb除以ratio,这里是为了做渐变,否则变化太生硬。

上图:

好了,上面两张图是一样的。只是屏幕背景一个是白色,一个是黑色。图片背景透明了。

cocos2d-x游戏开发(十四)用shader使图片背景透明相关推荐

  1. cocos2d-x3.2中用shader使图片背景透明

    今天有人问我问题,说怎么实现背景虚化,换句话说,就是把某张图片的背景颜色(比如白色)给弄没了,不然贴在屏幕上有白色背景.下面是解决方法.用shader处理了像素,使黑色背景透明. Shader.h # ...

  2. 【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!

     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigame.com/android-game/331.html 很多童鞋说 ...

  3. 【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/331.html 之 ...

  4. unity3D游戏开发十四之NGUI一

    在Unity中,可以使用代码控制其自身所携带的GUI来实现图形界面的搭建.但是这些组件的搭建效率很低,而且已经无法满足现在市场对图形用户界面美感的要求,所以,引入了NGUI来增加所要开发的图形用户界面 ...

  5. 【Visual C++】游戏开发笔记四十六 浅墨DirectX教程十四 模板测试与镜面特效专场

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处.   文章链接: http://blog.csdn.net/zhmxy555/article/details/8632184 作者:毛星云( ...

  6. iOS cocos2d 2游戏开发实战(第3版)---你的第一个游戏!

    2019独角兽企业重金招聘Python工程师标准>>> 随着苹果公司不断地创新与发展,新的iPhone 5.iPad 4以及iPad mini产品相继问世,包括iOS与Xcode在内 ...

  7. 【Visual C++】游戏开发笔记四十三 浅墨DirectX教程十一 为三维世界添彩:纹理映射技术(二)...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨)    邮箱: happylifemxy@163.com 本篇文章里,我们首先对Direct3D之中固定功能流水线中的 ...

  8. 【通知】▁▂▃ Himi 最新著作《iOS游戏编程之从零开始—Cocos2d-x与cocos2d引擎游戏开发》★书籍源码+第4/5/6样章★-免费下载★ ▃▂▁

    2013年新年,Himi的第二本著作:<iOS游戏编程之从零开始-Cocos2d-x与cocos2d引擎游戏开发>一书正式发售: (大家可以到新华书店.淘宝.拍拍.当当.亚马逊等进行购买) ...

  9. 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!

     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigame.com/android-game/327.html 很多童鞋说 ...

最新文章

  1. Java项目:仓库管理系统设计和实现(java+ssm+springboot+layui)
  2. Git学习系列之Git基本操作提交项目(图文详解)
  3. [C++] 井字棋游戏源码
  4. python cv release_cv2.videoCapture.release()是什么意思?
  5. jsp的九大内置对象和作用域
  6. 51Nod-1015 水仙花数【进制+查表搜索】
  7. 数据湖产业生态联盟会员权益
  8. tableau示例超市数据在哪儿_Tableau | 超市销售数据可视化分析
  9. 缺少 mysql 扩展_解决phpmyadmin中缺少mysqli扩展问题的方法
  10. 老电脑换Linux系统是否会更快,旧电脑不要装Windows!Bodhi Linux系统,小巧强悍,运行更流畅...
  11. 我的世界漆黑一片 看不见明天
  12. PyCharm获取csv文件
  13. 调用dll时出现“Unhandled exception 堆已损坏(heap corruption)“异常解决方法
  14. 一文搞清楚opengl、openglES、GLEW、的关系GLUT、FreeGLUT、GLFW
  15. shell 计算磁盘使用率
  16. spring @Autowired用法
  17. UE4 C++入门之路1-C++和蓝图的关系和介绍
  18. 韩国通关号免费查询系统,韩国清关码校验
  19. FMODxUnity联动的声音设计
  20. HC32L130国产超低功耗华大MCU芯片介绍

热门文章

  1. http请求协议分析
  2. 工程搭建:搭建子工程之分布式id生成器
  3. Servlet_生命周期详解
  4. 非对称加密算法 - Java加密与安全
  5. Spring WebApplicationContext
  6. 小苗快速培养盆景苗方法_九里香盆景的制作与养护
  7. TypeError: ‘int‘ object is not callable
  8. GCC 和 MDK (即 Keil) 手工指定其地址及指针
  9. ccflow表结构与运行机制(二次开发必读)
  10. Python 深拷贝和浅拷贝的区别