cocos2d制作动态光晕效果基础——blendFunc
转自:http://www.2cto.com/kf/201207/144191.html
最近的项目要求动态光晕的效果。
何谓动态光晕?之前不知道别人怎么称呼这个效果,
不过在我看来,“动态光晕”这个名儿起的还是蛮不错的。
动态光晕就是在背景图片的上面蒙上一层光照。。。
但是这个光照比较特别,他能够变换颜色,变换光圈的半径大小,从而制造出类似梦幻迷离的效果~
新项目中我是负责游戏特效这一块的,操作过程中我觉得这东西蛮不错的,很有感觉。
之前的项目中我是负责整个游戏场景的编码实现的,因为较为复杂的游戏逻辑,所以我做的很蛋痛~
伙计做的是菜单场景以及所有游戏的图片,那时候我便觉得,其实做美工也是一件很不错的事情:
没有让人蛋碎的bug等着你去修复,不需要去考虑某些游戏中比较关键的算法,很直观的就出图了,
工作的质量怎么样全看处出来的图怎么样,好看了,符合要求了便没有其他的麻烦事儿了。
基于此,我有意思向美工方向发展,新项目中包揽整个游戏的特殊效果,我做起来感觉便很舒心:
这个东西能够实时的看到出来的效果怎么样,很直观,同时也可以写些代码,甚至是研究一些比较有意思的算法,
这些算法也能够以很直观的方式呈现在眼前,这一切一切,都是让人感觉那么的享受~
好吧,废话到此为止,主要使用了下面的两张图片:
左边的那张是游戏的背景图片,右边的那张是光晕的基本图片~
素材到位了,实现方案也在,将右边那张图片直接叠在左边图片的上面。
不过,如果真有那么简单的话我也就没必要在这里啰唆了。
直接叠上去的话,背景图片中的那盏灯笼的细节会被遮盖的所剩无几,
cocos2d 添加 sprite 到 layer 的机制是这样的:
opengl 混合将z值较大的精灵叠在 z值较小的精灵上面,混合的配置是
(ccBlendFunc){GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA}
很简单,src(源) 代表偏上的精灵,dst(目标) 代表偏下的精灵
上面的配置所表示的含义为:
如果偏上的精灵半透明,那么最终呈现的画面将会隐隐的露出偏下的精灵图片,
如果偏上的精灵完全不透明,那么偏上精灵所在的部分会完全将底下的精灵图片遮盖住~
如果纯粹的 addChild ,addChild 将 精灵添加进来的话,效果呈现如下:
我所追求的动态光晕的效果可以在 photoshop中直观的表示出来,如下:
偏上的图层是光圈那种图片,混合模式采用的是柔光(softlight)~
项目发起人、出图师兼音效师给我的需求便是提供如上柔光的混合效果。
当然,事情远没有我想象的简单,photoshop 的柔光,强光,溶解等混合算法都是商业级的,
网上并不能找到具体的算法,整片叠底还好,定义明确还比较容易实现,
简单点说,就是将 sprite 的 setBlendFunc 的参数设置为
(ccBlendFunc){GL_DST_COLOR, GL_ZERO}
如果你对 opengl 的混合比较熟悉的话,就知道上面得出的结果正好满足正片叠底的定义~
另外就是,如下的参数设置同样也能得到整片叠低的效果
(ccBlendFunc){GL_ZERO, GL_SRC_COLOR}
得到的最终效果基本上是和上面那种参数设置是一致的~
但遗憾的是,整片叠低不是我所需求的混合模式:
其一,纯粹正片叠底的混合将会得到这样一幅图像,仅仅只是一个圆形的图像,如下:
其二,参照上图,很明显重叠的区域颜色的亮度反而降低了
这样的话,基本上就可以枪毙采用 正片叠底进行混合的方案了~
后来我又尝试了很多种的 blendFunc 参数配置,简单而言就是不断对参数进行搭配,
然后看程序运行的效果是否满足我的需求,opengles 混合的参数如下(blendFunc){SRC 源, DST 目标}:
// ******************************************************************
// iphoneOS5.0/Frameworks/OpenGLES.framework/ES2/gl.h /* BlendingFactorDest */
#define GL_ZERO 0
#define GL_ONE 1
#define GL_SRC_COLOR 0x0300
#define GL_ONE_MINUS_SRC_COLOR 0x0301
#define GL_SRC_ALPHA 0x0302
#define GL_ONE_MINUS_SRC_ALPHA 0x0303
#define GL_DST_ALPHA 0x0304
#define GL_ONE_MINUS_DST_ALPHA 0x0305 /* BlendingFactorSrc */
/* GL_ZERO */
/* GL_ONE */
#define GL_DST_COLOR 0x0306
#define GL_ONE_MINUS_DST_COLOR 0x0307
#define GL_SRC_ALPHA_SATURATE 0x0308
/* GL_SRC_ALPHA */
/* GL_ONE_MINUS_SRC_ALPHA */
/* GL_DST_ALPHA */
/* GL_ONE_MINUS_DST_ALPHA */ // ******************************************************************
// ***************************************************************** // 黑暗中的带背景图片纹理的光圈~
// ccBlendFunc tmp_oBlendFunc = {GL_DST_COLOR, GL_ZERO}; // 黑暗中的黄色光圈(前面表示upper,后面表示lower)~
// ccBlendFunc tmp_oBlendFunc = {GL_ONE, GL_ZERO}; // 黑暗中的黄色光圈(前面表示upper,后面表示lower)~
// ccBlendFunc tmp_oBlendFunc = {GL_DST_ALPHA, GL_ZERO}; // 默认的 blend 配置~
// ccBlendFunc tmp_oBlendFunc = {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA}; // premultiplied~
// ccBlendFunc tmp_oBlendFunc = {GL_ONE, GL_ONE_MINUS_SRC_ALPHA}; // 仅背景图片有所显示~
// ccBlendFunc tmp_oBlendFunc = {GL_ZERO, GL_ONE}; // 黄色光圈区域亮度加强(2倍的强度)~
// ccBlendFunc tmp_oBlendFunc = {GL_DST_COLOR, GL_SRC_COLOR}; // 正片叠底~
// ccBlendFunc tmp_oBlendFunc = {GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA}; // 类似柔光:黄色光圈区域亮度加强,其他地方也不会显示为纯黑(接近我想要的想过了)~
// ccBlendFunc tmp_oBlendFunc = {GL_DST_COLOR, GL_ONE}; // Screen~
// ccBlendFunc tmp_oBlendFunc = {GL_ONE_MINUS_DST_COLOR, GL_ONE}; // Linear Dodge~
// ccBlendFunc tmp_oBlendFunc = {GL_ONE, GL_ONE}; // 很类似柔光效果,这个也最接近我的需求了~
ccBlendFunc tmp_oBlendFunc = {GL_SRC_ALPHA, GL_ONE}; // GL_ONE_MINUS_SRC_ALPHA 注定是不行的(光晕中心会被模糊掉)~
// ccBlendFunc tmp_oBlendFunc = {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA}; // 标准的正片叠底~
// ccBlendFunc tmp_oBlendFunc = {GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA}; // 下面两种是差不多的~
// ccBlendFunc tmp_oBlendFunc = {GL_ZERO, GL_SRC_COLOR};
// ccBlendFunc tmp_oBlendFunc = {GL_DST_COLOR, GL_ZERO};
// ***************************************************************************************************************
// 1.正片叠底
// ccBlendFunc tmp_oBlendFunc = {GL_DST_COLOR, GL_ONE_MINUS_DST_ALPHA}; // 2.
// ccBlendFunc tmp_oBlendFunc = {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA}; // 3.黄色光圈区域显示背景图片,其他区域显示黑色(黄色光圈很柔和)~
// ccBlendFunc tmp_oBlendFunc = {GL_ZERO, GL_SRC_ALPHA}; // 4.背景图片在黄色光圈区域的图片尤为阴暗~
// ccBlendFunc tmp_oBlendFunc = {GL_ZERO, GL_ONE_MINUS_SRC_ALPHA}; // 5.仅仅显示出了原始的背景图片~
// ccBlendFunc tmp_oBlendFunc = {GL_ZERO, GL_DST_ALPHA}; // 6.全黑~
// ccBlendFunc tmp_oBlendFunc = {GL_ZERO, GL_ONE_MINUS_DST_ALPHA}; // ---------------------------------------- // 7.仅显示黄色光圈图片~
// ccBlendFunc tmp_oBlendFunc = {GL_ONE, GL_ZERO}; // 8.纯粹的添加光圈图片到背景图片上面~
// ccBlendFunc tmp_oBlendFunc = {GL_ONE, GL_ONE}; // 9.纯粹的添加光圈图片到背景图片上面~
// ccBlendFunc tmp_oBlendFunc = {GL_ONE, GL_DST_COLOR}; // 10.纯粹的添加光圈图片到背景图片上面~
// ccBlendFunc tmp_oBlendFunc = {GL_ONE, GL_ONE_MINUS_DST_COLOR}; // 11.纯粹的添加光圈图片到背景图片上面~
// ccBlendFunc tmp_oBlendFunc = {GL_ONE, GL_SRC_ALPHA_SATURATE}; // 12.黄色光圈区域显示背景图片,其他区域显示黑色(黄色光圈很刺眼)~
// ccBlendFunc tmp_oBlendFunc = {GL_ONE, GL_SRC_ALPHA}; // 13.
// ccBlendFunc tmp_oBlendFunc = {GL_SRC_COLOR, GL_DST_COLOR};
cocos2d制作动态光晕效果基础——blendFunc的更多相关文章
- cocos2d 制作动态光晕效果基础 —— blendFunc
转自:http://blog.csdn.net/yang3wei/article/details/7795764 最近的项目要求动态光晕的效果. 何谓动态光晕?之前不知道别人怎么称呼这个效果, 不过在 ...
- PS使用滤镜制作光晕效果
滤镜制作光晕效果 新建图层,将背景色填充为黑色 滤镜->渲染->镜头光晕 调整好光晕大小 通过滤色(图层两字下面一点点的位置,有个下拉菜单,点开就在里面),去黑留白 如果觉得光线不够,可以 ...
- 8、网页制作Dreamweaver(jQuery基础:安装、语法)
在<网页制作Dreamweaver(悬浮动态分层导航)>中,运用到了jQuery的技术,轻松实现了菜单的下拉.显示.隐藏的效果,不必再用样式表一点点地修改,省去了很多麻烦,那么jQuery ...
- 如何利用FineReport制作动态树报表
在对数据字段进行分类管理时,利用动态树折叠数据是一个很好的方法,也就是点击数据前面的加号才展开对应下面的数据,如下图.那这样的效果在制作报表时该如何实现呢? 下面以报表工具FineReport为例介绍 ...
- 利用Highcharts插件制作动态图表
向大家推荐一款js插件,用于绘制图表Highcharts,具体操作可参考官方网站:http://www.hcharts.cn/ 1.如下为本人制作的图形效果如下,当然其效果远不止这些,大家还可以深入研 ...
- HTML5 Maker – 在线轻松制作 HTML5 动画效果
HTML5 Maker 是一个在线动画制作工具,帮助你使用 HTML,CSS 和 JavaScript 创建动态,互动的内容.它非常容易使用,同时可以帮你实现非常好的效果.它可以制作跨浏览器的动画内容 ...
- Xcode 6制作动态及静态Framework和各种坑
Xcode 6制作动态及静态Framework http://www.cocoachina.com/ios/20141126/10322.html 有没有写SDK或者要将一些常用的工具类做成Frame ...
- Xcode + Swift 制作动态原型
转载: Xcode + Swift 制作动态原型 为什么是 Xcode 和 Swift 我们尝试过的动态原型设计工具,Origami, Form, Hype, FramerJS,Pixate 等,但都 ...
- Android - FragmentTabHost 与 Fragment 制作页面切换效果
使用 FragmentTabHost 与 Fragment 制作页面切换效果 API 19 TabHost已经不建议使用了.用 FragmentTabHost 来代替TabHost.实际上 Fragm ...
随机推荐
- 关于RF 315MHz
1.https://www.pjrc.com/teensy/td_libs_VirtualWire.html These modules worked very reliably when sitti ...
- Event/window.Event属性和方法
type:事件的类型,如onlick中的click:srcElement/target:事件源,就是发生事件的元素:button:声明被按下的鼠标键,整数,1代表左键,2代表右键,4代表中键,如果按下 ...
- 基于opencv的人脸检测的web应用
参考资料 https://github.com/bsdnoobz/web-based-face-detect http://opencv-code.com/projects/web-based-int ...
- ifstream 流 判断文件是否结尾的函数eof(.xml
pre{ line-height:1; color:#800080; font-size:16px;}.sysFunc{color:#627cf6;font-style:italic;font-wei ...
- 运算符重载 C++ 编程思想
class Integer{ int i; public: Integer(int ii) : i(ii) {} const Integer operator+(const Integer& ...
- scala 连接 mysql
code: import java.sql.{ResultSet, DriverManager} import com.mysql.jdbc.Connection object hoursAvg { ...
- Eclipse安装插件的方式
Eclipse有两种安装插件的方式,分为在线安装和手动安装,因为受到网络环境限制,推荐采用手动安装的方式,下面我们先来了解一下Eclipse手动安装插件的步骤. Eclipse手动安装插件: 第一种: ...
- [转]caffe+Ubuntu14.0.4 64bit 环境配置说明(无CUDA,caffe在CPU下运行) --for --Amd
caffe是一个简洁高效的深度学习框架,具体介绍可以看这里,caffe环境配置过程可以参考这里,我在搭建环境时搜集了许多资料,这里整理了一下,介绍一下caffe在无CUDA的环境下如何配置. 1. 安 ...
- hadoop的kerberos认证
言归正传,介绍过hadoop的simple认证和kerberos后,我们在这一章介绍hadoop的kerberos认证 我们还使用hadoop集群的机器. OS 版本: Centos6.4 Kerbe ...
- android学习笔记---发送状态栏通知
发送消息的代码如下: //获取通知管理器 NotificationManager mNotificationManager = (NotificationManager) getSystemServi ...