首先看到的是fannyfish在csdn上的博文,它把Shader X3上的Massively Parallel Particle Systems on the GPU论文大致做了翻译,但fannyfish同学的代码并未体现论文的算法思路,具体算法详见原版论文,基本思路在这里不再赘述。这篇论文的思路还是比较容易理解的,但随着开发的进行,遇到的问题也逐渐增多。首先遇到的是在顶点纹理中采样出来的点老是不准。经常会采到周围某个像素点去。解决办法是把纹理坐标加上半个像素。因为顶点纹理需要使用最近点采样,如果不加半个像素,那么离他最近的有4个像素点,到底采哪个是不确定的。其次遇到的是渲染帧速提升不明显。当时我是严格按照论文里的思路进行的编码,Cpu并不是完全空闲的,他要负责更新所有粒子的生命期,这就要维护一个粒子队列,而且当有粒子出生或是消亡的时候要通知GPU,这就需要更新粒子的顶点数据。而我一直认为lock顶点缓冲耗时,尤其数据放在显存中时。于是我想只在初始化时生成一边所有粒子的顶点数据,之后就不在碰它。那么粒子的消亡就在GPU中实现,通过把将要消亡的粒子移到很远处使之在ps前被剔除掉,而粒子的诞生则是通过shader中的一个变量控制。这个变量存储着位置纹理中需要诞生的那个粒子的索引和需要在这次draw中诞生的粒子个数。那么在GPU中可以计算出那些粒子索引需要被初始化。这个变量实际上就是每个点对应的纹理坐标。在cpu中,它需要做的就是填写这一帧需要产生多少个粒子和起始粒子的纹理坐标。