【Stage3D学习笔记续】真正的3D世界(五):粒子特效

先看效果,按下空格键添加粒子特效:

一般而言粒子特效的实现都是比较复杂的,且不说实现粒子特效的编码和设计,光是编写一个粒子编辑器就不是简单的一件事,但是作者使用了很取巧的方式来完成,我们接下来深入代码看看作者是怎么处理的。

Particle

在我还没有看这本书的这章之前我认为一个Particle应该是一个单一的粒子(或许是一个面片或者是一个简单的模型),而最终的粒子效果则是有成千上万个Particle组成渲染得出的,所以应该存在一个JSON或XML描述文件来指定每个粒子的运动轨迹和生命周期,不过作者可不是这样想的。

作者的一个Particle类即表示一个在3D软件中渲染好的粒子群,如下图:

是的,一个粒子类其实就是加载了上面的模型,而所有的粒子其实都在模型中创建好了,按照作者的说法,这样可以实现批处理,即一次DrawCall可以绘制模型中的所有粒子(废话);

那么我们接着看,粒子类继承自Entity类,主要的改动是添加了Mesh2这个属性,表示该类可以解析两个模型,那么为啥要解析两个模型呢?

关键帧插值:

如果我们的粒子对象就是一个包含了多个粒子的Mesh模型,该如何控制具体的面片或小粒子进行缩放位移或旋转呢?答案就在关键帧插值这里,引入的Mesh2和Mesh的数据是一一对应的,但是具体的顶点数据的位置缩放或旋转不同(其实就是复制第一个模型文件在3DMax中微调以后输出的新文件);

如果存在Mesh2的数据我们会使用下面的这段顶点着色器代码:

 1 vertexShader.assemble
 2 (
 3     Context3DProgramType.VERTEX,
 4     //换算起始坐标
 5     "mul vt0, va0, vc4.xxxx\n" +
 6     //换算终止坐标
 7     "mul vt1, va2, vc4.yyyy\n" +
 8     //在两个坐标里进行插值
 9     "add vt2, vt0, vt1\n" +
10     //和 mvp 矩阵进行 4x4 运算
11     "m44 op, vt2, vc0\n" +
12     //将 uv 数据传递到片段着色器
13     "mov v1, va1"
14 );

我们把Mesh的顶点数据作为源xyz,Mesh2的顶点数据作为终点xyz,传递一个时间常量vc4进行插值计算,就可以得到平滑的关键帧过渡的效果了。

如果只有一个Mesh,则仅仅是输出原有坐标这么简单。

同时我们的片段着色器也进行了插值:

 1 fragmentShader.assemble
 2 (
 3     Context3DProgramType.FRAGMENT,
 4     //对纹理进行取样
 5     "tex ft0, v1, fs0 <2d,linear,repeat,miplinear>\n" +
 6     //乘以淡入淡出矩阵
 7     "mul ft0, ft0, fc0\n" +
 8     //输出颜色
 9     "mov oc, ft0\n"
10 );

我们传入的fc0的alpha会根据时间进行0到1到0的变化,来实现淡入淡出的效果;

不同角度观察的处理:

想要使一个粒子对象无论从任意的角度看都保持一致一般来说大部分的粒子都是使用Billboard系统,作者没有使用这个方法,而是将一个面片复制成三个,像xyz三个平面一样交叉起来,具体可以看上面的截图,这样无论从那个方向看都可以看见我们的粒子,但是效果没有Billboard的好。

渲染模式:

使用了ADD模式去掉纹理的黑边,同时去掉了深度检测,由于是最后才进行渲染所以特效会显示在所有3D内容的前方;

ParticleSystem

确切的说是一个粒子对象池,避免大量创建新的粒子对象,同时使用粒子对象的clone方法创建新的粒子来达到共用顶点数据和贴图的目的。

ParticleTest

添加了粒子特效的创建代码和更新代码,同时输出粒子特效的三角形数量,具体的大家可以看代码。

时间: 2024-12-16 08:19:43

【Stage3D学习笔记续】真正的3D世界(五):粒子特效的相关文章

【Stage3D学习笔记续】山寨Starling(五):纹理计算和尺寸计算

尺寸计算: Starling中的尺寸是以像素为单位的,这一切都得力于我们使用的正交矩阵,还记得我们顶点数据中的位置数据么,如果我们提交的矩形的四个顶点为(0, 0)(0, 100)(100, 0)(100, 100),那么最终通过正交矩阵的转换后绘制到舞台时将会是长宽都为100个像素的矩形. 那么Starling中的尺寸获取其实就是基于顶点数据来进行获取,详细代码可以参考DisplayObject中的getBounds方法,主要看继承类DisplayObjectContainer和Quad的具体

【Stage3D学习笔记续】真正的3D世界(一):透视矩阵

如果各位看官跟着我的学习笔记一路看过来的话,一定会吐槽我的,这都是什么3D啊?从头到尾整个都是在使用GPU绘制一堆2D图像而已,的确,之前我们一直使用正交矩阵利用GPU加速来实现2D世界的展示,算不上真3D,但是正是由于有了之前的学习我们实现真3D世界的学习才会更加轻松,下面的笔记就让我们真正的进入3D世界吧! 补充一下,我们的这部分学习笔记是基于<Adobe Flash 11 Stage3D(Molehill) 游戏编程初学者指南>一书的学习而来的. 赶快进入我们的主题,是否还记得之前的2D

【Stage3D学习笔记续】真正的3D世界(六):空间大战

这就是书上的最终效果了,一个完整的空间大战游戏: 点击查看源码 这里并没有太多的新知识,所涉及的东西更多的是游戏开发方面的优化和技巧,下面我们大家一起来看看: 飞船: 类似粒子效果中的粒子创建方法,我们的游戏飞船也需要一样的创建机制进行创建,大家可以点击查看源码: GameActor GameActorPool 需要额外说明的是,添加了进行碰撞检测的机制,代码里写了基于球形的距离的碰撞检测(简单高效)和基于AABB盒的碰撞检测,但AABB盒的碰撞检测在实际的游戏中并没有使用. 另外添加了一点优化

【Stage3D学习笔记续】真正的3D世界(二):显示模型

虽然我们进入真3D世界了,但是上一章的Demo仍然是显示的一个平面,尽管我们的平面在3D空间中旋转可以看出一点3D透视的效果,但是既然是真3D,就要拿出点3D的样子来! 如果要显示3D模型,我们就要告别直接使用代码编写顶点数据的时代了,想想上一节,平面的四边形手写顶点或许还过得去,但是如果手写一个立方体的8个顶点数据就有点难了吧,如果是显示更加复杂的形状呢? 要显示一个3D模型,就需要一个特定格式的3D模型文件,3D模型文件一般使用3D建模工具创建,美术完成建模后会将模型导出为特定格式的3D模型

【Stage3D学习笔记续】山寨Starling(二):VertexData探幽

还记得之前的学习笔记中我们的顶点缓冲数组中的顶点数据么,我们使用一个一维数组来记录所有的顶点数据,这是由于顶点缓冲上传数据时是使用的一维数组. 如果对顶点数据进行一层代码的封装,就能更加的方便我们来操作顶点数据了. 所以引入了VertexData(顶点数据)这个类来进行封装. 在Starling中一个顶点需要记录9个数据,分别如下: 坐标数据 x 和 y(2D游戏就不需要z轴了,但是Starling中留下了 z 轴的位置的),开始索引为 0: 颜色数据 r.g.b.a(顶点颜色),开始索引为 3

【Stage3D学习笔记续】真正的3D世界(三):纹理效果

混合模式: 代码 示例是<Stage3D指南>中的直接弄出来的,可以通过点击键盘上的Q.W.E这3个按键,更换混合模式.模型和纹理,可以直观的查看不同混合模式的效果,住:下方的地形使用"context3D.setBlendFactors(Context3DBlendFactor.ONE, Context3DBlendFactor.ZERO);"正常混合模式渲染,上方中心的模型使用特定的混合模式渲染. 深度测试(Z-Buffer): 使用Z-Buffer的话,GPU会把每个像

【Stage3D学习笔记续】山寨Starling(十):高效游戏设计、纹理集和ATF

我发布了经过批处理优化的v0.3版,点击下载:https://github.com/hammerc/hammerc-study-Stage3D/archive/v0.3.zip 先看看我们批处理优化后程序的效果吧! 首先,为了能明显的看出差距,我把未优化v0.2版本的MovieClipTest.swf的动画数量调到250个,同时QuadBatchTest.swf的代码一致也是250个动画,只是使用的是经过批处理优化的v0.3版本. 为了查看实际的性能差异,我使用了scout,下面看看我们的成果吧

【Stage3D学习笔记续】山寨Starling(十二):总结和一些没提到的东西

我们的山寨Starling到这里就告一段落了,不得不说这是一个非常优秀的2D框架,他的设计和架构为后来的许多框架都提供了很好的参考,比如现在正在崛起的Egret,我们的一番解读也只是窥见了Starling内部的一部分,有兴趣的朋友可以继续看Starling的源码,一定会有更多的收获! 后悔的是我到这个时间才悔悟过来(切确的说是面试被鄙视的结果),开始看3D这块的知识,但我始终坚信一个道理,付出永远不会太迟,Let`s keep moving! 查看Starling的更新日志来了解这个框架的动态也

【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程

这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构. 由于Starling是模仿Flash的原生显示列表,所以我们可以参照原有的知识体系来阅读Straling的代码. Starling类: Straling类是整个Starling框架的核心,该类会管理Straling的显示列表.Touch事件.动画处理等等多个模块的功能: 同时Starling类会实现框架内部的帧循环: 实例化Starling类后会Starling