[cocos2d-x]对CCSprite进行高斯模糊

摘要 cocos2d-x
2.2.1 中没有直接用于模糊精灵的类,但是在TestCpp里面的ShaderTest实现了高斯模糊。于是直接搬过来用就行了。

cocos2d-x 高斯模糊 精灵 blur

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

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

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

01 // ShaderBlur
02  
03 class SpriteBlur : public CCSprite
04 {
05 public:
06     ~SpriteBlur();
07     void setBlurSize(float f);
08     bool initWithTexture(CCTexture2D* texture, const CCRect&  rect);
09     void draw();
10     void initProgram();
11     void listenBackToForeground(CCObject *obj);
12  
13     static SpriteBlur* create(const char *pszFileName);
14  
15     CCPoint blur_;
16     GLfloat    sub_[4];
17  
18     GLuint    blurLocation;
19     GLuint    subLocation;
20 };

实现:

001 SpriteBlur::~SpriteBlur()
002 {
003     CCNotificationCenter::sharedNotificationCenter()->removeObserver(this, EVENT_COME_TO_FOREGROUND);
004 }
005  
006 SpriteBlur* SpriteBlur::create(const char *pszFileName)
007 {
008     SpriteBlur* pRet = new SpriteBlur();
009     if (pRet && pRet->initWithFile(pszFileName))
010     {
011         pRet->autorelease();
012     }
013     else
014     {
015         CC_SAFE_DELETE(pRet);
016     }
017      
018     return pRet;
019 }
020  
021 void SpriteBlur::listenBackToForeground(CCObject *obj)
022 {
023     setShaderProgram(NULL);
024     initProgram();
025 }
026  
027 bool SpriteBlur::initWithTexture(CCTexture2D* texture, const CCRect& rect)
028 {
029     if( CCSprite::initWithTexture(texture, rect) ) 
030     {
031         CCNotificationCenter::sharedNotificationCenter()->addObserver(this,
032                                                                       callfuncO_selector(SpriteBlur::listenBackToForeground),
033                                                                       EVENT_COME_TO_FOREGROUND,
034                                                                       NULL);
035          
036         CCSize s = getTexture()->getContentSizeInPixels();
037  
038         blur_ = ccp(1/s.width, 1/s.height);
039         sub_[0] = sub_[1] = sub_[2] = sub_[3] = 0;
040  
041         this->initProgram();
042          
043         return true;
044     }
045  
046     return false;
047 }
048  
049 void SpriteBlur::initProgram()
050 {
051     GLchar * fragSource = (GLchar*) CCString::createWithContentsOfFile(
052                                 CCFileUtils::sharedFileUtils()->fullPathForFilename("Shaders/example_Blur.fsh").c_str())->getCString();
053     CCGLProgram* pProgram = new CCGLProgram();
054     pProgram->initWithVertexShaderByteArray(ccPositionTextureColor_vert, fragSource);
055     setShaderProgram(pProgram);
056     pProgram->release();
057      
058     CHECK_GL_ERROR_DEBUG();
059      
060     getShaderProgram()->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);
061     getShaderProgram()->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color);
062     getShaderProgram()->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);
063      
064     CHECK_GL_ERROR_DEBUG();
065      
066     getShaderProgram()->link();
067      
068     CHECK_GL_ERROR_DEBUG();
069      
070     getShaderProgram()->updateUniforms();
071      
072     CHECK_GL_ERROR_DEBUG();
073      
074     subLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "substract");
075     blurLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "blurSize");
076      
077     CHECK_GL_ERROR_DEBUG();
078 }
079  
080 void SpriteBlur::draw()
081 {
082     ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex );
083     ccBlendFunc blend = getBlendFunc();
084     ccGLBlendFunc(blend.src, blend.dst);
085  
086     getShaderProgram()->use();
087     getShaderProgram()->setUniformsForBuiltins();
088     getShaderProgram()->setUniformLocationWith2f(blurLocation, blur_.x, blur_.y);
089     getShaderProgram()->setUniformLocationWith4fv(subLocation, sub_, 1);
090  
091     ccGLBindTexture2D( getTexture()->getName());
092  
093     //
094     // Attributes
095     //
096 #define kQuadSize sizeof(m_sQuad.bl)
097     long offset = (long)&m_sQuad;
098  
099     // vertex
100     int diff = offsetof( ccV3F_C4B_T2F, vertices);
101     glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff));
102  
103     // texCoods
104     diff = offsetof( ccV3F_C4B_T2F, texCoords);
105     glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));
106  
107     // color
108     diff = offsetof( ccV3F_C4B_T2F, colors);
109     glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff));
110  
111  
112     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
113  
114     CC_INCREMENT_GL_DRAWS(1);
115 }
116  
117 void SpriteBlur::setBlurSize(float f)
118 {
119     CCSize s = getTexture()->getContentSizeInPixels();
120  
121     blur_ = ccp(1/s.width, 1/s.height);
122     blur_ = ccpMult(blur_,f);
123 }

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

1 static SpriteBlur* createWithTexture(CCTexture2D *pTexture);

实现:

01 SpriteBlur* SpriteBlur::createWithTexture(CCTexture2D *pTexture)
02 {
03     CCAssert(pTexture != NULL, "Invalid texture for sprite");
04  
05     CCRect rect = CCRectZero;
06     rect.size = pTexture->getContentSize();
07  
08     SpriteBlur* pRet = new SpriteBlur();
09     if (pRet && pRet->initWithTexture(pTexture,rect))
10     {
11         pRet->autorelease();
12     }
13     else
14     {
15         CC_SAFE_DELETE(pRet);
16     }
17      
18     return pRet;
19 }

用法:

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

效果:

注意:

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

时间: 2024-09-20 10:33:09

[cocos2d-x]对CCSprite进行高斯模糊的相关文章

Cocos2d-x碰撞检查与消灭的实现

#ifndef __HELLOWORLD_SCENE_H__   #define __HELLOWORLD_SCENE_H__      #include "cocos2d.h"   using namespace cocos2d;      class HelloWorld : public cocos2d::CCLayerColor   {   public:       // Method 'init' in cocos2d-x returns bool, instead of 

【IOS-COCOS2D游戏开发之十七】灵活使用精灵可视区域(TEXTURERECT)与锚点(ANCHORPOINT),并结合可视区域与锚点制作进度条!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/501.html 今天Himi单用一篇博文来给童鞋们介绍精灵相关的两个常用的细节知识点: 首先来介绍第一个知识点:精灵可视区域: 不管在哪个移动平台上进行开发游戏都会接触使用到可视区域,比如Kjava(J2me)平台的setClip方法,Android的clipRect方法等等,那么在iOS上也一样存在,这里我们

【IOS-COCOS2D(2.X) 游戏开发之一】自定义CCSPRITE中-(ID) INIT 重写需注意& 2.X版本中注册触屏事件代码&简述COCOS2D/X/UNITY3D引擎使用感想!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d-v2/736.html 先说下技术相关问题: Himi有段时间没有折腾Cocos2d-iphone了,前几天下载最新的Cocos2d 2.x版本尝试使用,发现两个常用知识点则需要注意的地方,这里分享下: 1.  对于Cocos2d 2.x版中,当你(自定义精灵)自定义一个类并继承精灵CCSprite时,务必要注意

《Cocos2D权威指南》——3.6 CCSprite精灵类

3.6 CCSprite精灵类 CCSprite是Cocos2D游戏开发中最常用的类,用图片把精灵(sprite)显示在屏幕上. 在游戏开发中,经常会遇到精灵(sprite)这个术语.精灵是一个图像,可以在屏幕上独立地移动.一个精灵可能是玩家角色.敌人,或者是大的背景图像.一般情况下,精灵来自于开发者所准备的PNG或PVRTC图像.一旦图像载入内存,就会将精灵转换成纹理图,从而被iPhone GPU用于在屏幕上渲染.3.6.1 CCSprite类的属性及方法 生成精灵的最简单方法是把图片文件加载

Cocosd2d实例教程(六) Cocos2d实现屏幕背景的自动滚动

1.介绍 实现屏幕背景的自动滚动是游戏常遇到的功能,这样我们就不用绘制很长的背景图片,只要设计一张就可以,省时省力.这章将实现这个功能,并把源代码贡献给大家,废话不多说,先上个图,其实是动态的,只是截动态图有点麻烦. 2.代码实现部分 屏幕的动态滚动主要是一个刷新机制的问题. 第一步,还是进入HelloWorldLayer.h中定义一些节点的对象 <span style="color:#362e2b">#import <GameKit/GameKit.h> //

Cocosd2d实例教程(五) Cocos2d添加虚拟摇杆控制器

1.介绍 cocos2d为我们提供了好用的摇杆控制器,主要是对ZJoystick.h和ZJoystick.m的添加,实现了如下图的功能.通过摇杆可以控制图中精灵的移动.(但是还有一个技术性问题亟待解决,就是精灵移动后会有一个重影留在初始位置) 2.摇杆的实现 1) 将资源中的ZJoystick文件夹加到工程中(页面下方提供下载地址), 精灵的添加以及移动前面已经讲了,不知道的同学可以看教程四.工程名字为ControlWalking 2)修改HelloWorldLayer.h文件.加入一些需要的节

IOS开发:Cocos2d触摸分发原理分析

  触摸是iOS程序的精髓所在,良好的触摸体验能让iOS程序得到非常好的效果,例如Clear.鉴于同学们只会用cocos2d的 CCTouchDispatcher 的 api 但并不知道工作原理,但了解触摸分发的过程是极为重要的.毕竟涉及到权限.两套协议等的各种分发. 本文以cocos2d-iphone源代码为讲解.cocos2d-x 于此类似,就不过多赘述了. 零.cocoaTouch的触摸 在讲解cocos2d触摸协议之前,我觉得我有必要提一下CocoaTouch那四个方法.毕竟cocos2

【HIMI转载推荐之一】如何优化COCOS2D/X程序的内存使用和程序大小

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/1043.html 貌似从Himi建博以来,从来没出现转载过博文的说.但是从今天起,Himi将一些非常好.很值得推荐的博文进行转载分享!大家如果有好的文章,请将博文链接或者内容邮件给我,xiaominghimi@gmail.com   317426208@qq.com        首先感谢 子龙 兄弟对文章翻译

Cocos-2d 坐标系及其坐标转换

 原作者:jlins  出处:博客园http://www.cnblogs.com/dyllove98/p/3231175.html  Cocos-2d中,涉及到4种坐标系: GL坐标系Cocos2D以OpenglES为图形库,所以它使用OpenglES坐标系.GL坐标系原点在屏幕左下角,x轴向右,y轴向上.  屏幕坐标系苹果的Quarze2D使用的是不同的坐标系统,原点在屏幕左上角,x轴向右,y轴向下.ios的屏幕触摸事件CCTouch传入的位置信息使用的是该坐标系.因此在cocos2d中对