MercuryParticleEngine的研究与本质分析

7 篇文章 0 订阅

        昨天偶然发现了XNA粒子系统的一个神器——Mercury Particle Engine 3.1 for XNA 4.0 (Binaries)。拿到这个引擎用了一下,第一感觉就是我这个在团队中负责做特效的可以被撤职了,而且是自己把自己撤了!因为Mercury粒子引擎做的实在是太好太漂亮,而且引用也方便。下面是这个引擎“光束”特效的一个截图

   

怎么样?看到之后颤抖吧!我仰天长叹,国内的程序员都死哪了?!怎么都是国外的在做这种引擎,而且虽然不是开源,不过用反编译工具是很轻易的窥视作者的代码的。

感叹完了,今天又把这个系统研究了一番,并且反编译了一下看了下源码发现其实是我写粒子效果的思路出了问题,其实Mercury引擎的算法基础是很简单的。

粒子引擎通用的算法机制

Speed += Acceleration;

Position += Speed;

Rotation += AngularSpeed;

Color = F(gametime);

Scale = F(gametime);

当然在Mercury引擎中又针对加速度多了一个方程。我觉得并不是十分必要,因为从物理角度来说Force跟Acceleration其实是靠质量mass来连接,而且这行代码也不是牛顿第二定律的原理

Acceleration += Force;

然后我就思考一个问题,为何Mercury引擎的效果这么漂亮,然后我发现里面有一个文件夹叫做Textures,里面放着各种各样的贴图,比如下面这个名字为FlameFlare的图片(正常来说背景应该是透明的,左边我在背景加了颜色,右边是把图像的对比度加大)

                  

在引擎中的效果如下(火焰效果)


是不是有种恍然大悟的感觉,原理炫丽的效果竟然是因为贴图的精心设计,我瞬间觉得我又有继续任职的必要了……当然为了保证我能够任职,我还要检测一下把图片放到我的粒子引擎是不是也会有同样炫丽的效果,于是……我把素材替换了一下,并且添加了这句话color = new Color(new Vector4(0.5509804f, 0.1509804f, 0.1509804f, alpha));……结果如下图


我瞬间觉得我被坑了……

当然剩下的工作就是找原因,反编译了下源码

Color值跟我一样的定义啊,都是Vector4,xml里面的配置也是按rgb+opacity的格式给的,那这么扯淡的效果是什么原因呢?

除了自己弱还能是神马原因……

当然我忘了自己是如何推导出这个解决方案的,反正我还是自行解决了,问题的关键在于spriteBatch.Begin的重载方式上,有一个重载方式要设定BlendState,就是颜色的混合方式,我们的代码如下

spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);其实当时我也不知道应该把混合方式BlendState改成什么样子,于是一个个试了试,试到NonPremultiplied发现有如下效果


咳咳,终于算是解决了。

那NonPremultiplied到底是什么意思呢?下面仅仅是我个人的猜测。

首先Premultiplied是一种处理图像透明度的方式,可以参照这篇文章http://rintarou.dyndns.org/2010/04/27/premultiplied-alpha/,也就是说Premultiplied是把图像中的alpha值事先分配给了rgb值,这样的话会提高一定的运算效率。但是问题就在这里,如果说图像本身的alpha值分配被提前分配好了,那么修改spriteBatch.Draw中的color值相当于把原图又重新刷了一遍,图片本身的alpha值的分布会因为color中的alpha后赋值而变得整体alpha值都一样,出现上面“纯色”的效果。但是如果spriteBatch.Draw中的color与原图的color共同考虑,也就是说真正的R值为R = (color.R * color.alpha + imagepixel.R * imagepixel.alpha) / 2 这样的话就避免了图片“纯色”的现象。
XNA给出的英文解释如下
// 摘要:
        //     A built-in state object with settings for blending with non-premultipled
        //     alpha,
that is blending source and destination data using alpha while assuming
        //     the color data contains no alpha information.
红字部分其实就是我对于公式R = (color.R * color.alpha + imagepixel.R * imagepixel.alpha) / 2的印证吧。

解决了XNA粒子的一大问题啊!以前我还以为火焰效果是拿一大堆的“颗粒”堆砌而成,没想到竟然是拿贴图来做的,而且只含透明度信息的贴图对于颜色的修改也会提供很大的自由。
最终还是赞美一下MercuryParticleEngine!
There is still a lot for me to go through!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Mercury 浏览器 2.1.0 件名称:Mercury 浏览器 APK名称:com.ilegendsoft.mercury 最新版本:2.1.0 支持ROM:2.3及更高版本 界面语言:简体中文 软件大小:14.03 M 开发者:iLegendsoft,Inc. 应用简介 ··· 作为iOS平台的明星浏览器,众人期盼Mercury能推出安卓版浏览器已有些时日。为了答谢广大用户的厚爱和殷切期盼,我们隆重向您推出Mercury 安卓版浏览器。Mercury安卓版浏览器秉承了Mercury追求卓越品质的一贯精神,其精简、迅捷的使用体验和人性化设计的各个功能将会让您充分享受 精彩的互联网生活。 迅捷浏览—Mercury能让您的浏览和搜索更顺畅。您还可以编辑自己的快速链接以便直接访问常用地址。 强大功能---插件、用户代理、手势控制、 自动填充表单等等功能使您的网页浏览变得更加简便。 安全保护--- Mercury浏览器的诸多安全功能能保护您的个人隐私不被泄露。隐私模式、浏览器密码、历史&cookies一键清除等功能使您高枕无忧。 特征: ★插件 – 实用插件诸如阅读模式、翻译、Dropbox和广告拦截等人性化功能使您的上网更加便捷。 ★用户代理 – 使用用户代理能令网站服务器给您发送台式电脑适用的网页,功能更齐全。 ★隐私模式 – 打开隐私模式将使Mercury浏览器不记录您的浏览历史和cookies,您的个人隐私将会被充分保护。 ★一键清除浏览历史和cookies – 杜绝一切被偷窥隐私的可能性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值