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

Shader.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__) */

Shader.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;}while(0);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();// 绑定纹理到纹理槽0ccGLBindTexture2D(m_pobTexture->getName());#define kQuadSize sizeof(m_sQuad.bl)long offset = (long)&m_sQuad;// vertexint diff = offsetof( ccV3F_C4B_T2F, vertices);glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff));// texCoodsdiff = offsetof( ccV3F_C4B_T2F, texCoords);glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));// colordiff = offsetof( ccV3F_C4B_T2F, colors);glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff));glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);CHECK_GL_ERROR_DEBUG();CC_INCREMENT_GL_DRAWS(1);CC_PROFILER_STOP_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw");
}

片段着色器代码

tansparentshader.h


#ifdef GL_ES
precision lowp float;
#endif
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
uniform sampler2D u_texture;
void main()
{                                                       float ratio=0.0;                                    vec4 texColor = texture2D(u_texture, v_texCoord);   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)
{                                                          texColor[0] = texColor[0] /  ratio;                    texColor[1] = texColor[1] /  ratio;                    texColor[2] = texColor[2] /  ratio;                    texColor[3] = ratio;
}
else
{                                                          texColor[3] = 0.0;
}
gl_FragColor = v_fragmentColor*texColor;
}";

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

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

上图看看吧

改变前:

改变后:

不懂的可以关注我的公众号,里面有你想要的(有问题公众号留言必回答)https://mp.weixin.qq.com/s?__biz=MzIyOTM4MDMxNw==&mid=2247483836&idx=2&sn=1e1d922b5f2511e550da712921992d32&chksm=e842d80edf35511810bc8e383992c2e6a38665e466328200265386ab16fc4601d4822badf546&token=573588601&lang=zh_CN#rd

cocos2d-x3.2中用shader使图片背景透明相关推荐

  1. cocos2d-x游戏开发(十四)用shader使图片背景透明

    欢迎转载,地址:http://blog.csdn.net/fylz1125/article/details/8631783 好吧,终于抽时间写这篇文章了. 手头上有很多人物行走图,技能特效图等,但这些 ...

  2. php添加背景图及设置格式,PHP添加PNG图片背景透明水印操作类定义与用法示例

    本文实例讲述了PHP添加PNG图片背景透明水印操作类定义与用法.分享给大家供大家参考,具体如下: 图片相关操作类 class ImageTool { private $imagePath;//图片路径 ...

  3. Zxing系列之设置二维码图片背景透明教程

    继之前的博客:PDF文件添加二维码水印教程.图片添加二维码水印教程之后,对之前的添加二维码水印功能进行完善,之前的程序生成的二维码图片背景不是透明的,所以不是很美观,所以本博客对程序进行完善,对二维码 ...

  4. 将剪切板中的图片粘贴至Word,浮动于文字上方,设置图片背景透明

    Sub Macro1()      '将剪切板中的图片粘贴至Word      Selection.Paste      '执行循环      For i = 1 To ActiveDocument. ...

  5. cocos2dx3.X shader使图片置灰

    1 OpenGL ES着色器 opengl es的着色器有.fsh和.vsh两个文件.这两个文件在被编译和链接后就可以产生可执行程序与GPU交互.attribute是从外部传进来的,每一个顶点都会有这 ...

  6. python 做界面时如何使图片保持透明背景_Python matplotlib生成图片背景透明的示例代码...

    使用matplotlib生成图片,想要背景透明,而且图例部分也显示透明效果,找到了大概的设置方法,特此记录. # coding=utf-8 # matplotlib背景透明示例图 # python 3 ...

  7. python 做界面时如何使图片保持透明背景_Python matplotlib生成图片背景透明

    使用matplotlib生成图片,想要背景透明,而且图例部分也显示透明效果,找到了大概的设置方法,特此记录. # coding=utf-8 # matplotlib背景透明示例图 # python 3 ...

  8. 图片如何去掉背景色?如何使图片背景变透明?

    图片设计工作者常常需要用透明背景图片,如果下载的图片素材不是透明背景的话,就需要先用图片处理工具将图片背景变透明.下面我们就使用压缩图的图片去底色(https://www.yasuotu.com/bu ...

  9. python图片背景透明软件_使图像背景透明

    我有一个橙色和白色背景的图像.我想让白色的背景透明.下面的代码使用grabcut来制作一个掩码.然后我将图像分割成rgb通道,并在alpha通道上应用遮罩.从下面的图片中可以看到,后抓取和遮罩图片都可 ...

最新文章

  1. php-fpm的pool、php-fpm慢执行日志、open_basedir、php-fpm进程管理
  2. C发展史:KR C/C89/C99/C11 C++发展史: C++98/C++03/C++11
  3. 图论算法-图论的表示、分类及基本概念(系列1)
  4. zabbix监控之二----Zabbix受控端及监控项
  5. 马云最怕的事还是来了,央行对借呗动真格!
  6. 蓝桥杯JAVA---2013---B----世纪末的星期
  7. python 输入框查询_Element输入框带历史查询记录
  8. c语言字符加密向后四位_Base64加密?它只是一种编码算法,切勿用来加密
  9. 飞飞CMS黑色自适应BX8X主题模板
  10. mysql5.7.17免安装版_MySql 5.7.17免安装配置
  11. VS2010调用python编写的代码error:cannot open file 'python27_d.lib'.
  12. Javascript模块化编程 (附WebTrends的dcsMultiTrack方法浅述)
  13. mitmproxy工具使用小红书数据抓取
  14. 国家计算机机房地址,国家电子计算机机房设计规范..doc
  15. Windows任务栏搜索功能修复
  16. 关于C语言的随机函数
  17. 入门激光雷达点云的3D目标检测
  18. alex机器人 ser_基于Web Service的机器人远程控制系统设计
  19. switch商店显示服务器维护,国服switch eshop商城常见问题汇总 购买数字版问题答疑...
  20. 网络编程及TCP/UDP协议

热门文章

  1. TIA博途WINCC中英文切换的项目中摄氏度符号无法正常显示的解决办法
  2. Windows10商店安装Ubuntu 18.04 LTS
  3. [论文翻译]据传比MTCCN的FaceBoxes《FaceBoxes: A CPU Real-time Face Detector with High Accuracy》
  4. 一个产品人和“阿里云”的故事
  5. windows7计算机测试,WinSAT 测试在 Windows 7 中失败
  6. 自动编码器在野外去除遮挡_在野外作曲
  7. nb-lot plc python_你一定要了解的NB-IoT !
  8. 数据库大量数据操作中事务优化方案
  9. JS的日期操作:String转date日期格式、求日期差
  10. 【历史上的今天】1 月 18 日:微软的“技术布道者”;反盗版法案抗议行动;哈佛 Mark I 灵感起源