粒子系统的学习
本文转自:http://goldlion.blog.51cto.com/4127613/767801
直接使用工具来感受一下粒子系统的强大威力吧。
网络上有很多粒子编辑器,大多数都是收费的。magicalsoft提供了一个免费的粒子编辑器(该工具目前只有mac版本),界面如下:
我们将针对这个编辑器来讲解粒子系统。其他的和这个功能差不多。
第一部分:为什么要有粒子系统?
粒子系统在游戏中被大量的应用于游戏特效,能够极大的提高游戏的画面观感。
使用帧动画也可以实现特效效果。但是缺点也很明显:
1.画面效果弱
2.细节不自然
3.修改不方便
以前,手机性能不强的时候,使用粒子系统是非常蛋疼的。现在手机硬件配置和软件支持(OpenGL)的大幅度强化,让强大的粒子系统有了展示的机会。
第二部分:粒子系统生命周期
粒子一旦诞生都要经历完整的生命周期:
首先,从粒子池中获取一个粒子,
然后计算赋予初始属性后,发射他。
在粒子飞行过程中,不断的刷新来修正他的属性。
粒子死亡后,回归粒子池。
第三部分:粒子相关属性
Variance浮动值:表示随机上下浮动的修正值,实际值由原始值+浮动值组成,例如Lifespan=5,Lifespan Variance=1那么随机出来的结果就是4~6
第四部分:发射器相关属性
发射器有两种,一种是重力发射器(用于实现在重力条件下的粒子运动),另一种是放射发射器(用于实现在无重力下的粒子运动)。
第五部分:OpenGL混合
#1神马是混合?
混合就是把两种颜色混在一起。具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。
假设我们需要绘制这样一个场景:透过红色的玻璃去看绿色的物体,那么可以先绘制绿色的物体,再绘制红色玻璃。在绘制红色玻璃的时候,利用“混合”功能,把将要绘制上去的红色和原来的绿色进行混合,于是得到一种新的颜色,看上去就好像玻璃是半透明的。
#2混合中的术语
前面我们已经提到,混合需要把原来的颜色和将要画上去的颜色找出来,经过某种方式处理后得到一种新的颜色。这里把将要画上去的颜色称为“源颜色”,如上例中的红色;把原来的颜色称为“目标颜色”,如上例中的绿色。
OpenGL会把源颜色和目标颜色各自取出,并乘以一个系数(源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”),然后相加,这样就得到了新的颜色。(也可以不是相加,新版本的OpenGL可以设置运算方式,包括加、减、取两者中较大的、取两者中较小的、逻辑运算等,但我们这里为了简单起见,不讨论这个了)
#3混合公式
下面用数学公式来表达一下这个运算方式。假设源颜色的四个分量(指红色,绿色,蓝色,alpha值)是(Rs,Gs,Bs,As),目标颜色的四个分量是(Rd,Gd,Bd,Ad),又设源因子为(Sr,Sg,Sb,Sa),目标因子为(Dr,Dg,Db,Da)。则混合产生的新颜色可以表示为:
(Rs*Sr+Rd*Dr,Gs*Sg+Gd*Dg,Bs*Sb+Bd*Db,As*Sa+Ad*Da)
当然了,如果颜色的某一分量超过了1.0,则它会被自动截取为1.0,不需要考虑越界的问题。
#4各种混合因子
在OpenGL中,源因子和目标因子是可以通过glBlendFunc函数来进行设置的。glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。这两个参数可以是多种值,下面介绍比较常用的几种。
GL_ZERO: 表示使用0.0作为因子,实际上相当于不使用这种颜色参与混合运算。
GL_ONE: 表示使用1.0作为因子,实际上相当于完全的使用了这种颜色参与混合运算。
GL_SRC_ALPHA:表示使用源颜色的alpha值来作为因子。
GL_DST_ALPHA:表示使用目标颜色的alpha值来作为因子。
GL_ONE_MINUS_SRC_ALPHA:表示用1.0减去源颜色的alpha值来作为因子。
GL_ONE_MINUS_DST_ALPHA:表示用1.0减去目标颜色的alpha值来作为因子。
除此以外,还有GL_SRC_COLOR(把源颜色的四个分量分别作为因子的四个分量)、GL_ONE_MINUS_SRC_COLOR、GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR等,前两个在OpenGL旧版本中只能用于设置目标因子,后两个在OpenGL旧版本中只能用于设置源因子。新版本的OpenGL则没有这个限制,并且支持新的GL_CONST_COLOR(设定一种常数颜色,将其四个分量分别作为因子的四个分量)、GL_ONE_MINUS_CONST_COLOR、GL_CONST_ALPHA、GL_ONE_MINUS_CONST_ALPHA。另外还有GL_SRC_ALPHA_SATURATE。新版本的OpenGL还允许颜色的alpha值和RGB值采用不同的混合因子。但这些都不是我们现在所需要了解的。毕竟这还是入门教材,不需要整得太复杂~
举例来说:
如果设置了glBlendFunc(GL_ONE,GL_ZERO);,则表示完全使用源颜色,完全不使用目标颜色,因此画面效果和不使用混合的时候一致(当然效率可能会低一点点)。如果没有设置源因子和目标因子,则默认情况就是这样的设置。
如果设置了glBlendFunc(GL_ZERO,GL_ONE);,则表示完全不使用源颜色,因此无论你想画什么,最后都不会被画上去了。(但这并不是说这样设置就没有用,有些时候可能有特殊用途)
如果设置了glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);,则表示源颜色乘以自身的alpha值,目标颜色乘以1.0减去源颜色的alpha值,这样一来,源颜色的alpha值越大,则产生的新颜色中源颜色所占比例就越大,而目标颜色所占比例则减小。这种情况下,我们可以简单的将源颜色的alpha值理解为“不透明度”。这也是混合时最常用的方式。
ottom:0px; margin-top:0px; margin-bottom:0px; clear:both; height:auto; overflow:hidden; color:rgb(44,GL_ONE);,则表示完全使用源颜色和目标颜色,最终的颜色实际上就是两种颜色的简单相加。例如红色(1,0)和绿色(0,1,0)相加得到(1,0),结果为黄色。
注意:
所谓源颜色和目标颜色,是跟绘制的顺序有关的。假如先绘制了一个红色的物体,再在其上绘制绿色的物体。则绿色是源颜色,红色是目标颜色。如果顺序反过来,则红色就是源颜色,绿色才是目标颜色。在绘制时,应该注意顺序,使得绘制的源颜色与设置的源因子对应,目标颜色与设置的目标因子对应。不要被混乱的顺序搞晕了。
#5混合举例
glBlendFunc(GL_ONE,GL_ZERO)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
第六部分:纹理Texture
如果没有贴图的话,所有粒子将会是单调的色块。在当前这个工具中,只需要点击Texture区域即可添加贴图。粒子的贴图没有具体限制,可以是灰度图,也可以是一张具体的图片。但要小于64x64pixel
第七部分:绘制粒子的代码
绘制粒子的代码非常简单,由于magicalsoft的粒子编辑器,不能导出缺省的Texture。所以我准备了现成的meteor.plist和meteor.png。
将这两个导入到xcode中的resource里,然后在当前Scene中添加如下代码:
- CCParticleSystem*meteor=CCParticleSystemQuad::particleWithFile("meteor.plist");
- meteor->setPosition(ccp(size.width/2,size.height/2));
- this->addChild(meteor);
运行效果:
参考文献:
《cocos2d Game Develop》第九章 粒子系统
知易Cocos2D-iPhone 游戏开发教程007 粒子系统
OPENGL混合(ZZ):http://hi.baidu.com/asky007/blog/item/1f8bcded3da7dd4979f0555e.html
粒子系统的学习的更多相关文章
-
ios – 痛苦地减慢软件向量,特别是CoreGraphics与OpenGL
)在这个实验之后,我切换到了OpenGL和MonkVG库,我感到非常高兴.我现在可以在没有任何帧速率下降的情况下同时渲染HUNDREDS曲线,对保真度的影响很小.>我是否有可能以某种方式滥用CoreGraphics,或者性能真的那么糟糕?我的预感是问题在于CoreGraphics,基于StackOverflow/论坛问题的数量以及有关CG性能的答案.从技术上讲,为什么会这样呢?>如果CoreGraphics真的那么慢,Safari究竟如何顺利地工作?OpenGL在早餐时吃这个测试.矢量绘图怎么可能如此慢得
-
为什么这个OpenGL ES 2.0着色器不能在iOS上使用我的VBO?
如果有人能够了解这里出了什么问题,也许是对gl命令或其他一些不兼容的命令序列的错误排序,我将非常感谢你的帮助.尽管谷歌在“OpenGLES2.0编程指南”中进行了大量研究和研究,但我一直试图让这段代码整天都没有成功.我正在尝试在iPhone上的OpenGLES2.0中使用顶点缓冲区对象和自定义着色器.我试图交错来自以下类型的一系列自定义结构的顶点数据:位置,半径和颜色字节分别考虑顶点位置,点大小和
-
ios – 为什么Apple建议在串行后台队列中调度OpenGL命令,这不可避免地会导致崩溃?
他们suggest:WhenusingGCD,useadedicatedserialqueuetodispatchcommandstoOpenGLES;thiscanbeusedtoreplacetheconventionalmutexpattern.我不明白这个建议.我无法解决这种冲突:当应用程序的app委托收到-applicationWillResignActive调用时,它必须立即停止调用任
-
在iOS中渲染水彩画
我一直在iOS中使用OpenGL,并使用glColor4f设置颜色,然后在白色UIImageView上绘制自己的颜色.我基本上有一个刷子,然后移动我的用户的触摸,然后它将颜色画在画布上.但这种颜色需要是水漆有没有人理解/知道如何获得这样的应用程序的水色,以及背景UIImageView如何具有纹理?
-
iOS:是否在OpenGL上实现Core Graphics?
我发现一个图表显示了在OpenGL上执行的CoreGraphics,另一个将它放在OpenGL旁边.我会认为,苹果会聪明地给每个图形硬件的平等访问,但是再次,我不太了解他们正在使用的图形芯片…也许是3D一直吗?这里有人知道具体细节吗?
-
ios – 有没有办法加速iPad模拟器的OpenGL性能?
iPad模拟器太慢,无法测试OpenGL图形.有没有办法让它更快?
-
xcode – 在Mac上使用OpenGL ES功能
我试图将opengl绘制到2d空间,并且正在执行以下操作,但它不会编译:我已经包含了OpenGL.framework框架,编译器跟踪说明如下.我已经没有关于如何解决它的想法.我的目标是目前的桌面应用程序,但我的目标是最终制作一个iPhone应用程序.解决方法你有没有包含适当的标题?在Mac上,这些是可能在iPhone上他们是另外,如果我没弄错的话,glOrthof()是特定于OpenGL-ES的.您可能需要在Mac上使用glOrtho().
-
ios – OpenGL ES 2.0在iPad / iPhone上的视频
如果任何人有任何建议或OpenGL的工作代码示例–>视频将是惊人的…
-
iOS金属线宽
我想设置我在Metal中绘制的线条的宽度.我可以使用point_size设置点的大小,如下所述:https://developer.apple.com/library/prerelease/ios/documentation/Metal/Reference/MTLRenderCommandEncoder_Ref/index.html但是,我不确定它如何与线条配合使用.解决方法简短的回答是没有办法以
-
ios – 如何使用OpenGL避免透明度重叠?
我正在研究iOS上的手写应用程序.我从iOS文档中找到了由OpenGLES实现的示例项目“GLPaint”,并对其进行了一些修改.我跟踪触摸点并计算点之间的曲线并单独绘制粒子图像曲线,使其看起来像手指经过的位置.我得到的是一条看起来相当不错的实线.但现在我想绘制半透明高光而不是实线.因此,我使用50%透明度替换粒子图像而不更改代码.Resultof50%transparencyparticleim
随机推荐
-
【cocos2d-x 3.x 学习笔记】对象内存管理
Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[
-
利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文
由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。
-
利用cocos2dx 3.2开发消灭星星七关于星星的算法
在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。
-
cocos2dx3.x 新手打包APK注意事项!
这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久
-
利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制
如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。
-
利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效
needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了
-
02 Cocos2D-x引擎win7环境搭建及创建项目
官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。
-
利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享
一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接
-
03 Helloworld
程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return
-
MenuItemImage*图标菜单创建注意事项
学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。