2019独角兽企业重金招聘Python工程师标准>>>

你可以从下面的目录找到示例的源代码:

cocos2d-x-2.2.1\samples\Cpp\TestCpp\Classes\ShaderTest

SpriteBlur类用于实现高斯模糊,但并没有定义在ShaderTest.h中,打开ShaderTest.cpp,大概在488行有这个类的定义和实现:

// ShaderBlurclass SpriteBlur : public CCSprite
{
public:~SpriteBlur();void setBlurSize(float f);bool initWithTexture(CCTexture2D* texture, const CCRect&  rect);void draw();void initProgram();void listenBackToForeground(CCObject *obj);static SpriteBlur* create(const char *pszFileName);CCPoint blur_;GLfloat    sub_[4];GLuint    blurLocation;GLuint    subLocation;
};

实现:

SpriteBlur::~SpriteBlur()
{CCNotificationCenter::sharedNotificationCenter()->removeObserver(this, EVENT_COME_TO_FOREGROUND);
}SpriteBlur* SpriteBlur::create(const char *pszFileName)
{SpriteBlur* pRet = new SpriteBlur();if (pRet && pRet->initWithFile(pszFileName)){pRet->autorelease();}else{CC_SAFE_DELETE(pRet);}return pRet;
}void SpriteBlur::listenBackToForeground(CCObject *obj)
{setShaderProgram(NULL);initProgram();
}bool SpriteBlur::initWithTexture(CCTexture2D* texture, const CCRect& rect)
{if( CCSprite::initWithTexture(texture, rect) ) {CCNotificationCenter::sharedNotificationCenter()->addObserver(this,callfuncO_selector(SpriteBlur::listenBackToForeground),EVENT_COME_TO_FOREGROUND,NULL);CCSize s = getTexture()->getContentSizeInPixels();blur_ = ccp(1/s.width, 1/s.height);sub_[0] = sub_[1] = sub_[2] = sub_[3] = 0;this->initProgram();return true;}return false;
}void SpriteBlur::initProgram()
{GLchar * fragSource = (GLchar*) CCString::createWithContentsOfFile(CCFileUtils::sharedFileUtils()->fullPathForFilename("Shaders/example_Blur.fsh").c_str())->getCString();CCGLProgram* pProgram = new CCGLProgram();pProgram->initWithVertexShaderByteArray(ccPositionTextureColor_vert, fragSource);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();CHECK_GL_ERROR_DEBUG();subLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "substract");blurLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "blurSize");CHECK_GL_ERROR_DEBUG();
}void SpriteBlur::draw()
{ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex );ccBlendFunc blend = getBlendFunc();ccGLBlendFunc(blend.src, blend.dst);getShaderProgram()->use();getShaderProgram()->setUniformsForBuiltins();getShaderProgram()->setUniformLocationWith2f(blurLocation, blur_.x, blur_.y);getShaderProgram()->setUniformLocationWith4fv(subLocation, sub_, 1);ccGLBindTexture2D( getTexture()->getName());//// Attributes//
#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);CC_INCREMENT_GL_DRAWS(1);
}void SpriteBlur::setBlurSize(float f)
{CCSize s = getTexture()->getContentSizeInPixels();blur_ = ccp(1/s.width, 1/s.height);blur_ = ccpMult(blur_,f);
}

好了,直接copy到你的program里面,不过有一点需要注意,就是他这个只能用一个文件(图片)create,如果需要用一个Texture初始化(因为有时候需要模糊即时的sprite),可以稍微改装一下,加一个函数:

static SpriteBlur* createWithTexture(CCTexture2D *pTexture);

实现:

SpriteBlur* SpriteBlur::createWithTexture(CCTexture2D *pTexture)
{CCAssert(pTexture != NULL, "Invalid texture for sprite");CCRect rect = CCRectZero;rect.size = pTexture->getContentSize();SpriteBlur* pRet = new SpriteBlur();if (pRet && pRet->initWithTexture(pTexture,rect)){pRet->autorelease();}else{CC_SAFE_DELETE(pRet);}return pRet;
}

用法:

SpriteBlur *bluredSpr = SpriteBlur::createWithTexture(tex);
bluredSpr->setPosition(ccp(sz.width/2,sz.height/2));
bluredSpr->setBlurSize(0.9f); // 这里稍微设小一点
addChild(bluredSpr);

效果:

注意:

他需要一个fsh文件(具体看它的实现),似乎是叠texture用的,找到example_Blur.fsh放到你的Resources\Shaders目录下

转载于:https://my.oschina.net/ybusad/blog/192436

【cocos2d-x】对CCSprite进行高斯模糊相关推荐

  1. 初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比(一家之言)

    初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比 初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比 发布于:2013-07-18 11:00阅读数:1984 ...

  2. 初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比

    前言 iOS7 beta发布后,大部分开发者和用户的注意力都集中在了iOS 7的全新UI交互设计界面上.一直负责硬件工业设计的Jony Ive首次全面负责苹果的软件和硬件设计工作,自然要把他自己的设计 ...

  3. cocos2d x 入门学习(一)实例制作简单的射击小游戏Star Fighter

    我们将使用cocos2d-x制作一个简单的射击游戏. 本文所用的制作环境是cocos2d x 2.0.4,VS2010. 参考资料: 1.本文的原型其实是来自cocos2d-2.0-x-2.0.4官方 ...

  4. cocos2d-x的A*寻路

    如果你还不熟悉A*寻路,请先看下这篇文章http://blog.csdn.net/dssdss123/article/details/11494065 一.先介绍几个函数和结构: 1.virtual ...

  5. cocos2d-x学习笔记03:绘制基本图元

    第一部分:基本图形绘制 cocos2dx封装了大量opengl函数,用于快速绘制基本图形,这些代码的例子在,tests\DrawPrimitivesTest目录下 注意,该方法是重载node的draw ...

  6. cocos2dx视频教程进阶篇--第2天--打砖块游戏-box2d物理引擎

    感谢大家的鼓励和支持,今天进阶篇2奉献给大家. 不了解cocos2dx基本概念的朋友,请移步 http://blog.csdn.net/s_xing/article/details/18557631. ...

  7. cocos2dx 精灵的移动(2)

    目标:想要精灵进行随机的移动. 过程:需要一个白色的背景,所以先来修改 HelloWorld 的继承,改成继承 CCLayerColor,然后修改一下 init 方法.如下: CCLayerColor ...

  8. SpriteKit学习笔记(六)关于Sprit…

    今早看了一篇文章,关于SpriteKit与cocos2d的对比的,写得很不错,里面谈到的关于SpriteKit的东西也说得很好,大概第总结了SpriteKit,有很多是我之前的文章中没提到过的,现在赶 ...

  9. Creator模块介绍—领略模块化的力量

    从Cocos2d-js到Creator,一直以来都有模块裁剪的能力,可以将游戏中没有用到的功能代码,在编译输时移除,从而减少包体大小,这对H5游戏来说影响比较明显.Creator比Cocos2d-js ...

最新文章

  1. yolov3 paddle
  2. Delphi下载指定网址(URL)的文件,带进度条显示
  3. libnss mysql_Ubuntu通过LDAP集成AD域账号登录(libnss-ldap方式)
  4. LeetCode之Fizz Buzz
  5. 税控盘抄报税显示服务器为空,税控盘显示离线是什么原因造成的?怎么处理?...
  6. Java界面排号系统_【前端系统】javaweb技术的医院门诊在线预约及排号管理系统的实现...
  7. 让2个并列的div根据内容自动保持同等高度js
  8. 【SQL注入05】延时盲注实例操作
  9. css小点,css3效果:animate实现点点点loading动画效果(二)
  10. CentOS7使用Yum安装k8s
  11. 云原生 - 自建数据库与云数据库RDS性能优势分析,值不值得购买?
  12. bind智能DNS + bindUI管理系统(postgresql + bind dlz)
  13. 点餐推荐系统_自助点餐、自助收银…智慧餐厅的下一步又会是什么?
  14. pppoe拨号.bat
  15. grep同时过滤多个条件
  16. 如何在outlook里面把收件箱分组,以便快速的查看最重要的email。
  17. 真核生物 18S rRNA
  18. python两张图合成一张_Python图像处理实现两幅图像合成一幅图像的方法【测试可用】...
  19. 安装SQL Server 2000时“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机”错误的排除
  20. 神经网络 深度神经网络,主流的神经网络的框架

热门文章

  1. Perl Fork的问题
  2. xlinux中实现mdev
  3. 侯捷推荐的C++书单
  4. 用python绘制用例图源代码_Python设计模式 - UML - 用例图
  5. 怎么在大数据里面删除不了_数据库删除大数据怎么操作
  6. 安阳学院有几次计算机考试,安阳:2017年上半年全国计算机等级考试顺利结束...
  7. python 标准库 excel_Python 操作 Excel 的函数库
  8. python编程特点_Python基础(1)--Python编程习惯与特点
  9. 安装报错_Mysqlclient安装报错的3种情况
  10. 跨网段局域网如何互通_如何实现局域网中不同网段互访?企业网必备的高级静态路由...