使用OpenGL ES 2.0在3D中绘制火焰字母

我对如何实现这一点感到困惑。 我想要的是“用火焰画”。 我已经成功地实现了这个纹理,但现在我关心的是用粒子来实现火焰效果。 我应该创建一个path,我应该添加许多粒子发射器,将发射火焰粒子? 我理解2D的概念,但对3D来说,粒子总是应该面向用户?

我担心的另外一个问题是,由于拥有这么多的粒子发射器将会发生性能冲击,因为同时可以有许多字母和图画,而且每个元素都有许多粒子发射器。

更新1:

更详细的解释:

我有一个点的path,这是我的模型。 想象一下例如一个虚线的字母“S”。 我想让“S”着火。 “S”只是一个例子,它可以是一个圆形,三角形,一条线,几乎任何我所描述的path点。

为了达到这个效果,我想到了使用粒子。 所以我使用一个名为“粒子devise器”的程序来创建一个消防风格的粒子发射器。 这个发射器在iphone屏幕尺寸上看起来非常完美。 所以我想我可以画一个S或其他任何数字,如果我把许多粒子发射器放在彼此相邻的path之后。

为了从2D版本移动到3D版本,我考虑了缩放发射器(在其模型matrix中使用缩放matrix乘法),然后将其移动到3D世界中的某个点。 我这样做,它的工作原理。 所以现在我在3D世界中有一个粒子发射器。

我的问题是,你是如何实现一个燃烧的信? 如果我期望在我的世界上有许多燃烧的path,这太低效了吗? 我是否应该旋转粒子的四边形,以便它始终看着用户? (最后一个是因为我注意到如果你从侧面看它的粒子开始变平)

更新2:

我testing了这个,有多个粒子发射器,而且他们看起来相当好,我得到的最差的粒子越多。 一个常见的情况是在同一时间至less有大约50个不同的行/字母。

目前粒子发射器在CPU上。 它计算每个粒子的顶点的位置,并将新的顶点提供给GPU。 这对于一些排放者来说效果不错,但是还不足以让所有的字母都“燃烧”。

我正考虑在着色器中将粒子发射器执行的计算移动到GPU,但是这似乎有些复杂,因为每个粒子都有其自己的状态并且被修改为时间增量。 在CPU中,它只是一个以前一个值作为参考来改变它的值的对象,但是GPU渲染器只是每个绘制调用运行一次,不是吗?

是的,这是可能的,而且已经做了很多次了。

你想要的是所谓的广告牌 ,他们是简单的飞机,转变为总是看着相机。 在GLSL Programming Wikibook上有一个实现。

你会想要发射粒子(这是广告牌)的发射器,没有必要移动任何东西到GPU,发射粒子并不昂贵,昂贵的是在屏幕上绘制数百甚至数千粒子,也确保使用一个非常轻的粒子类,并用Object Pooldevise模式重新使用旧粒子类,因为垃圾回收应该很难打到你。

对于你的着色器, 在顶点着色器上做广告牌计算 ,它应该把一些工作移动到GPU上,确保你只是不要过度devise着色器,因为它们会被调用到很多粒子!

这应该已经让你在屏幕上画出成千上万的粒子,并仍然有其他游戏的性能。 即使最终吃掉所有移动的贵重CPU,也会使发射器发射更less的粒子 。 大多数情况下,你仍然可以用一半的粒子获得很好的效果,明智的做法是只在需要的地方进行性能testing。

你更大的问题将是排列发射器,让他们感觉像真正的文字。 以下是我的头顶上的一些选项:

  • 得到一个低分辨率的位图纹理,例如10px高的字符,对于每个gliph,扫描像素,对于每个像素集,logging它的坐标。 保存所有的坐标保存为所有的gliphs。 稍后将其放大,在稍后将发射器放在世界上时用作偏移量。
  • 获取vector字体库,获取每个字形的path,为字形的每个pathlogging均匀间隔的点。 稍后放置发射器时,将这些点用作偏移。
  • 在一些软件上devise一组发射器,或者甚至用铅笔和纸,在一些文件上写下它们的值,甚至在数组上使用硬编码,使用这些点作为偏移量。
  • 先将最后一个选项与前两个选项混合。 然后生成然后调整它。

这应该给你一个很好的开始,祝你好运!