转自:http://blog.csdn.net/dawn_moon/article/details/8631783

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

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

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

ShaderSprite.h

 #ifndef __TestShader__ShaderSprite__
 #define __TestShader__ShaderSprite__

 #include "cocos2d.h"
 USING_NS_CC;

 class ShaderSprite : public CCSprite {

 public:
     static ShaderSprite* create(const char* pszFileName);
     virtual bool initWithTexture(CCTexture2D *pTexture, const CCRect& rect);
     virtual void draw(void);
 };

 #endif /* defined(__TestShader__ShaderSprite__) */

ShaderSprite.cpp

 #include "ShaderSprite.h"

 static CC_DLL const GLchar *transparentshader =
 #include "tansparentshader.h"

 ShaderSprite* ShaderSprite::create(const char *pszFileName)
 {
     ShaderSprite *pRet = new ShaderSprite();
     if (pRet && pRet->initWithFile(pszFileName)) {
         pRet->autorelease();
         return pRet;
     }
     else
     {
         delete pRet;
         pRet = NULL;
         return NULL;
     }
 }

 bool ShaderSprite::initWithTexture(CCTexture2D *pTexture, const CCRect& rect)
 {
     do{
 //        CCLog("override initWithTexture!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
         CC_BREAK_IF(!CCSprite::initWithTexture(pTexture, rect));

         // 加载顶点着色器和片元着色器
         m_pShaderProgram = new  CCGLProgram();
         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();

         CHECK_GL_ERROR_DEBUG();

         // 设置移动、缩放、旋转矩阵
         m_pShaderProgram->updateUniforms();

         CHECK_GL_ERROR_DEBUG();

         return true;

     });
     return false;
 }

 void ShaderSprite::draw(void)
 {
 //    CCLog("override draw!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
     CC_PROFILER_START_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw");

     CCAssert(!m_pobBatchNode, "If CCSprite is being rendered by CCSpriteBatchNode, CCSprite#draw SHOULD NOT be called");

     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());

 #define kQuadSize sizeof(m_sQuad.bl)
     long offset = (long)&m_sQuad;

     // vertex
     int diff = offsetof( ccV3F_C4B_T2F, vertices);
     glVertexAttribPointer(kCCVertexAttrib_Position, , GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff));

     // texCoods
     diff = offsetof( ccV3F_C4B_T2F, texCoords);
     glVertexAttribPointer(kCCVertexAttrib_TexCoords, , GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));

     // color
     diff = offsetof( ccV3F_C4B_T2F, colors);
     glVertexAttribPointer(kCCVertexAttrib_Color, , GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff));

     glDrawArrays(GL_TRIANGLE_STRIP, , );

     CHECK_GL_ERROR_DEBUG();

     CC_INCREMENT_GL_DRAWS();
     CC_PROFILER_STOP_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw");
 }

片段着色器代码

tansparentshader.h

 "                                                       \n\
 #ifdef GL_ES                                            \n\
 precision lowp float;                                   \n\
 #endif                                                  \n\
 varying vec4 v_fragmentColor;                           \n\
 varying vec2 v_texCoord;                                \n\
 uniform sampler2D u_texture;                            \n\
 void main()                                             \n\
 {                                                       \n\
     float ratio=0.0;                                    \n\
     vec4 texColor = texture2D(u_texture, v_texCoord);   \n\
     ratio = texColor[] > texColor[]?(texColor[] > texColor[] ? texColor[] : texColor[]) :(texColor[] > texColor[]? texColor[] : texColor[]);                                      \n\
 if (ratio != 0.0)                                          \n\
 {                                                          \n\
     texColor[] = texColor[] /  ratio;                    \n\
     texColor[] = texColor[] /  ratio;                    \n\
     texColor[] = texColor[] /  ratio;                    \n\
     texColor[] = ratio;                                   \n\
 }                                                          \n\
 else                                                       \n\
 {                                                          \n\
     texColor[] = 0.0;                                     \n\
 }                                                          \n\
 gl_FragColor = v_fragmentColor*texColor;                   \n\
 }";

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

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

上图:

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

【转】cocos2d-x游戏开发(十四)用shader使图片背景透明的更多相关文章

  1. iOS cocos2d 2游戏开发实战(第3版)书评

    2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...

  2. STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  3. python运维开发(十四)----HTML基本操作

    内容目录: HTML概述 head标签 body中常用标签 css选择器 css常用属性 HTML HTML概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言) ...

  4. Java微信公众平台开发(十四)【番外篇】--微信web开发者工具使用

    转自:http://www.cuiyongzhi.com/post/58.html 为帮助开发者更方便.更安全地开发和调试基于微信的网页,微信推出了 web 开发者工具.它是一个桌面应用,通过模拟微信 ...

  5. cocos2d-x游戏开发(十五)游戏加载动画loading界面

    个人原创,欢迎转载:http://blog.csdn.net/dawn_moon/article/details/11478885 这个资源加载的loading界面demo是在玩客网做逆转三国的时候随 ...

  6. cocos2d-x游戏开发(十五)游戏载入动画loading界面

    这个资源载入的loading界面demo是在玩客网做逆转三国的时候随手写的,尽管我在那仅仅待了2个礼拜.可是也算參与了一个商业游戏项目了,学到不少东西.当时使用的cocos2d-x还是1.0版的,我用 ...

  7. cocos2d-x游戏开发(十六)帧动画

    欢迎转载:http://blog.csdn.net/dawn_moon/article/details/11775745 本来想写一下帧动画的,搜了一下网上好像有一大把,就懒得写了,直接贴代码. // ...

  8. cocos2d-x游戏开发 跑酷(四) 关联与物理世界

    原创.转载注明出处http://blog.csdn.net/dawn_moon/article/details/21451077 前面一节尽管实现了一个跑动的人物,可是他只不过一个精灵在运行一个跑动的 ...

  9. unity3D游戏开发十八之NGUI动画

    我们先来看下帧动画,顾名思义,就是一帧帧的图片组成的动画,我们须要用到UISprite Animation组件,它的属性例如以下: Framerate:播放速率,也就是每秒钟播放的帧数 Name Pr ...

随机推荐

  1. WPF自定义控件之带倒计时的按钮--Button

    1.说明 之前做过一个小项目,点击按钮,按钮进入倒计时无效状态,计时完成后,恢复原样,现在就实现该效果---带倒计时的按钮 2.效果 1)正常状态               2)MouseOver( ...

  2. hdu 5343 MZL's Circle Zhou SAM

    MZL's Circle Zhou 题意:给定两个长度不超过a,b(1 <= |a|,|b| <= 90000),x为a的连续子串,b为y的连续子串(x和y均可以是空串):问x+y形成的不 ...

  3. windows 与fedora时间差

    windows 默认BIOS时间当前时间UTC+时区, 按北京时间时区,就是要加8个小时. Linux默认BIOS时间是UTC时间,所以同一机子上装WINDOWS与LINUX时间上会差8个小时.这问题 ...

  4. RAC环境下SCAN IP可以PING通,1521端口也可以TELNET,但是无法建立数据库连接

    昨天用户请求帮助处理一个问题:有个厂家需要连某个业务系统的数据库,网络上已经开通了权限,SCAN IP可以PING通,测试TELNET 1521端口也是正常.但是想通过SQLPLUS连接,总是会提示连 ...

  5. cocos2dx之Lua调用C++

    现在cocos2dx3.8自己封装了以前的toLua++,比以前更好用了. 先来看一下整体步骤: 1.编写一个.ini文件. 2,修改genbindings.py脚本. 3,执行genbindings ...

  6. sql之表连接 筛选条件放在 连接外和放在连接里的区别

    使用一个简单的例子,说明他们之间的区别 使用的表:[Sales.Orders]订单表和[Sales.Customers]客户表,和上一篇博客的表相同 业务要求:查询出 : 所有的用户 在 2012-1 ...

  7. 获取网页上数据(图片、文字、视频)-b

    Demo地址:http://download.csdn.net/detail/u012881779/8831835 获取网页上所有图片.获取所有html.获取网页title.获取网页内容文字... . ...

  8. C#学习笔记---基础入门(三)

    泛型<T> 使用泛型能够最大限度的重用代码/保护类型安全,提高性能 泛型成员因为类型的不确定性,不能使用算术运算符/比较运算符 类型参数可以有多个,可以是编译器能够识别的任何类型 类型参数 ...

  9. having——至少被订购过两回的订单

    此篇介绍having的用法 一.表:订单表,产品表 说明:订单表order ,包含prodectid 二.查询至少被订购过两回的订单 800x600 Normal 0 7.8 磅 0 2 false ...

  10. Linux下使用GDB调试程序

    问题描述:          Linux下使用GDB调试程序 问题解决:          (1)生成调试文件 注:         使用命令   gdb IOStream.c   -o IOStre ...