在Cocos2d-x v3.x 中实现带颜色滤镜的Sprite
2014-11-20 19:37
836 查看
一、目的
Cocos2d-x做项目时经常会碰到要对图片进行变色的需求,最常用的就是变灰了,就要让按钮变灰来表示当前的状态是不可点的。 但是Cocos2d-x的Sprite中是没有这个变灰支持的。那么,就要我们自己动手来扩展实现一个。我们让这个带变色功能的Sprite叫做FilterSprite。这个FilterSprite扩展了Sprite的功能:可以方便地变换颜色。
二、原理
对图片进行颜色变换,就是对图片上的每个像素进行变换。要实现这个,要新创建一个fragmentShader,这个fragmentShader 比sprite的那个fragmentShader多了一个颜色变换矩阵。shader会让图片上每个像素与颜色变换矩阵进行相乘,输出新的像素值。
这个shader是这样的:
从shader上我们看到,“filterMat” 就是所谓的颜色变换矩阵,仅仅在原来像素输出前用它处理了一下:与待输出像素相乘。 这个shader是opengl层级的,要应用到coco2dx引擎中,我们要着手实现cocos2dx的FilterSprite类了。
三、实现
实现这个FilterSprite注意几个要点:
引擎中一个shader对应一个GLProgram,所以这个带颜色滤镜的shader(称为filterShader)对应一个GLProgram(称为filterProgram)对象,在实际使用时,是用对GLProgram进行了封装的GLProgramState(称为filterProgramState)对象,FilterSprite对象的_glProgramState要设置成filterProgramState对象,在源码中FilterSprite的initWithTexture进行这个filterShader和filterProgram的关联。
在渲染时要将滤镜传递给shader程序,在源码中就是在onDraw回调时调用:
四、使用
使用起来非常简单,只需要设置一个颜色矩阵,例如,如果要变灰就设置一个灰度矩阵,如果要恢复原貌就设置一个单位矩阵。
五、源码
FilterSprite.h:
FilterSprite.cpp:
来源网址:http://www.cocoachina.com/bbs/read.php?tid-238457.html
Cocos2d-x做项目时经常会碰到要对图片进行变色的需求,最常用的就是变灰了,就要让按钮变灰来表示当前的状态是不可点的。 但是Cocos2d-x的Sprite中是没有这个变灰支持的。那么,就要我们自己动手来扩展实现一个。我们让这个带变色功能的Sprite叫做FilterSprite。这个FilterSprite扩展了Sprite的功能:可以方便地变换颜色。
二、原理
对图片进行颜色变换,就是对图片上的每个像素进行变换。要实现这个,要新创建一个fragmentShader,这个fragmentShader 比sprite的那个fragmentShader多了一个颜色变换矩阵。shader会让图片上每个像素与颜色变换矩阵进行相乘,输出新的像素值。
这个shader是这样的:
三、实现
实现这个FilterSprite注意几个要点:
引擎中一个shader对应一个GLProgram,所以这个带颜色滤镜的shader(称为filterShader)对应一个GLProgram(称为filterProgram)对象,在实际使用时,是用对GLProgram进行了封装的GLProgramState(称为filterProgramState)对象,FilterSprite对象的_glProgramState要设置成filterProgramState对象,在源码中FilterSprite的initWithTexture进行这个filterShader和filterProgram的关联。
在渲染时要将滤镜传递给shader程序,在源码中就是在onDraw回调时调用:
使用起来非常简单,只需要设置一个颜色矩阵,例如,如果要变灰就设置一个灰度矩阵,如果要恢复原貌就设置一个单位矩阵。
FilterSprite.h:
相关文章推荐
- 在Cocos2d-x v3.x 中实现带颜色滤镜的Sprite
- 在cocos2dx 3.x 中实现带颜色滤镜的Sprite
- 在cocos2dx 3.x 中实现带颜色滤镜的Sprite
- 14.2.2 实现和运行颜色滤镜
- (译)使用cocos2d、LevelHelper和SpriteHelper实现疯狂考拉(Part 2)
- Cocos2d-js 3.0 颜色变换(调整sprite/图片的色调)
- Cocos2d 自定义Sprite的实现方法
- SpriteBuilder&Cocos2D使用CCEffect特效实现天黑天亮过度效果
- Cocos2d-js 3.0 颜色变换(调整sprite/图片的色调)
- cocos2d-x 3.2 |如何实现图片显示和精灵动画 Sprite
- SpriteBuilder&Cocos2D使用CCEffect特效实现天黑天亮过度效果
- (译)使用cocos2d、LevelHelper和SpriteHelper实现疯狂考拉(Part 3)
- 【转载】IE下利用滤镜实现背景颜色渐变
- cocos2d-x 之 CCProgressTimer 以及扩展实现颜色渐变进度条等等
- Cocos2d-x v3.X的颜色混合BlendFunc使用详解
- (译)使用cocos2d、LevelHelper和SpriteHelper实现疯狂考拉(Part 1)
- cocos2d-x 基于CCClippingNode实现CCLayer遮罩功能,在滑动时超出剪切区域的实现显示部分的效果,不需要再借助其他sprite来遮挡了
- cocos2d中sprite动画 及实现 总结
- 卡通渲染Cocos2d-x中的实现(描边与对物体表面颜色的色阶化)
- SpriteBuilder&Cocos2D使用CCEffect特效实现天黑天亮过度效果