基于gpu的粒子系统的制作方法

文档序号:6631731阅读:204来源:国知局
专利名称:基于gpu的粒子系统的制作方法
技术领域
本发明涉及一种粒子系统,特别是一种基于GPU的粒子系统。
背景技术
粒子系统是迄今为止被认为模拟不规则模糊物体非常有效的一种图形生成算法,它采用一种统一的模式来生成诸如云、烟、火、水等具有不规则形状的自然现象。在粒子系统中,景象被定义为由成千上万个不规则的、随机分布的粒子所组成,而每一个粒子均有一定的生命周期,它们不断改变形状、不断运动,充分的体现了不规则物体的性质。
但是,粒子系统不是一个简单的静态系统,随着时间的推移,系统中已有粒子不仅不断改变属性、不断运动,而且不断有新粒子的加入,并有旧粒子消失。同时,为使粒子系统所表示的景象具有良好的随机性,与粒子有关的每一参数均将受到一个随机过程的控制。粒子系统的上述造型方式使得用它来模拟动态自然景象(如水的流动、云的漂移等)成为可能。目前现有的用于仿真绘制不定型物的粒子系统的运算都是在CPU中进行的,每一帧生成的景象均是通过CPU根据粒子运动方程计算内存中存储的粒子属性,将计算出的粒子位置信息传递给图形处理单元GPU(Graphic ProcessingUnit)绘制在显示屏中。
粒子系统可以很方便的仿真模拟不定型物体的运动,因此在目前的三维仿真场景中有很广泛的应用,但是目前大多数的粒子系统都是基于CPU的,每个粒子的运动轨迹都是要通过CPU实时计算出来的,然后再通过数据总线将数据从系统内存传输到显示硬件中绘制出来,这样一方面CPU对于矩阵计算的能力比较弱,另一方面,将数据从CPU传输到图形处理单元GPU的过程将非常耗时,这就大大降低了粒子系统的实时性能。

发明内容
本发明的技术解决问题克服现有技术的不足,提供一种基于GPU的粒子系统,它可以提高计算能力和运行效率,同时使系统的实时性能大大提高。
本发明的技术解决方案基于GPU的粒子系统,其特点在于(1)首先,在系统内存CPU中分配一块存储区域,该存储区域被分为三部分,其中第一部分“空闲索引”用来存储系统可以容纳的所有粒子的索引;第二部分“新粒子堆栈”,用来保存当前产生的新粒子的粒子索引和粒子属性;第三部分“活动粒子堆栈”,用来保存当前系统中总共有多少存活的粒子;(2)从“空闲索引”中读取一个空闲索引与新产生的粒子索引和粒子属性一同保存在“新粒子堆栈”和“活动粒子堆栈”中,生成新粒子;(3)从“新粒子堆栈”中读取新粒子信息保存到显示内存中,其中粒子的速度信息和位置信息保存在第一组纹理中,然后更新粒子的属性;(4)从上述显示内存的一组纹理中读取粒子信息,根据运动方程计算出粒子在下一时刻的位置和速度信息并保存到显示内存的第二组纹理中,然后更新粒子信息,包括粒子的速度和位置纹理,如果粒子达到生存周期,在显示内存的第一组纹理中将粒子的位置信息改为无穷远处,在系统内存中,将粒子从“活动粒子堆栈”中删除;(5)将更新后的粒子属性从显示内存的纹理中写回到系统内存的顶点数组;(6)绘制粒子。
所述基于显示内存的两组纹理采用显示内存中的像素缓存Pbuffer来实现,将Pbuffer分为5块,其中两组纹理占用4块,另一块用于保存粒子的其他不随粒子运动方程改变的属性。
所述步骤(3)中的保存方法就是将对应的Pbuffer的绘制上下文转变为当前系统的绘制上下文,然后进行绘制操作。
本发明的原理是将粒子系统中粒子的位置与速度保存在浮点纹理中,以这些纹理作为图形硬件GPU的输入与输出,所有粒子的物理仿真及渲染过程均通过Cg代码在GPU中实现,这样就避免了CPU与GPU的频繁通讯,另一方面利用GPU的多通道并行计算性能则更加一步的提高了系统的实时性。
本发明与现有技术相比的优点在于(1)本发明针对CPU与GPU的数据通信是实时仿真系统的瓶颈的问题,采用多个纹理来保存粒子属性,将属性的值作为颜色信息存储在纹理的相应位置上,包括粒子速度纹理、位置纹理、其他属性纹理等,从而大大减少了仿真时CPU与GPU之间通信的数据量,使系统性能得到极大幅度的提升。
(2)本发明针对纹理不能同时作为数据输入与输出载体的问题,采用双缓存机制来存储粒子的速度与位置属性,在绘制下一帧时通过交换缓存来实现对纹理的读写操作。为了进一步解决数据通信问题,在GPU中完成计算粒子的速度与位置属性的数据更新过程,有效利用了GPU的多通道并行计算能力提高运行效率。
(3)本发明提供对多种不定型物模拟的支持,用户只需根据其物理属性和运动模式提供相应的属性和运动仿真方程,设定粒子系统的粒子属性,并且将运动方程添加到系统提供的框架结构中,即可以实现对某一种特定不定型物的仿真。
(4)本发明针对属性纹理的产生与使用方法,采用像素缓存PBuffer来实现纹理的操作。像素缓存支持应用程序在显示内存中产生复杂的可编程图像,这些图像可以被当作纹理一样操作,甚至可以被写回到系统内存中。这样解决了粒子属性数据的存储与更新问题。


图1为本发明的实现原理示意图;图2为本发明的系统内存的存储空间分配方式示意图;图3为本发明的粒子属性存储方式图。
具体实施例方式
如图1所示,本发明的系统开始时,首先进行初始化,初始化的内容主要包括两个方面,一个方面是对当前计算机系统和OpenGL扩展函数的初始化,目的是检查当前的计算机配置和显卡驱动程序是否支持必需的OpenGL函数,其中包括对OpenGL的初始化和声明在本系统中必要的OpenGL扩展函数,OpenGL的扩展函数必须通过wglGetExtensionsStringARB()函数和wglGetProcAddress()函数初始化,其中第一个函数用于检查系统是否支持这个OpenGL扩展,第二个函数用于得到函数指针;系统初始化的第二个方面是使用第一部分声明的OpenGL扩展函数初始化像素缓存Pbuffer。
由于本发明使用纹理存储粒子系统的各种属性,所以对系统纹理的设计和使用是本系统的重点。本系统使用像素缓存Pbuffer充当纹理来存储粒子的属性,Pbuffer是显示内存中的一部分,应进行初始化生成Pbuffer。初始化Pbuffer的过程是首先,在显示内存中划分几块区域用来当作Pbuffer,本系统中划分至少5块,其中两块用于保存粒子的速度属性,两块用来保存粒子的位置属性,最后一块用于保存粒子的其他不随粒子运动方程改变的属性(粒子的生存时间等),然后初始化每一个Pbuffer,初始化每个Pbuffer的过程是先将系统的绘制上下文指定到相应的Pbuffer上,因为Pbuffer是在显示内存中的一部分,所以Pbuffe就可以当作帧缓存来使用,也就是说可以通过绘制过程将数据绘制到Pbuffer上,也可以通过读取帧缓存数据的方法读取Pbuffer中的像素数据,将绘制上下文指定到一个Pbuffer上后,以后所有的绘制工作就是对这个Pbuffer的操作了,所以本发明可以将粒子的速度、位置及其他属性信息保存到相应的Pbuffer中。在初始化这个步骤当中,还没有实际的粒子属性信息,但可以通过这个步骤将显示内存中的Pbuffer规格化,让其拥有固定的数据结构,以备过后的数据保存。
初始化Pbuffer后,本发明还需要在系统内存中分配一块内存空间,如图2所示,这块内存空间又被分为FreeIndices、newParticles和activeParticles三个部分,其中FreeIndices为“空闲索引”,用来存储系统可以容纳的所有粒子的索引,newParticles“新粒子堆栈”用来保存当前产生的新粒子的粒子索引和粒子属性,在绘制每一帧时都要更新这个部分,将当前帧要产生的粒子送到显示内存的纹理中,再将下一帧所要产生的粒子的信息更新到“新粒子堆栈”中,activeParticles“活动粒子堆栈”,用来保存当前系统中总共有多少存活的粒子,系统在每一帧绘制完成后计算各个存活粒子的生存周期,对于超过生存时间的粒子,在系统内存中将粒子从“活动粒子堆栈”中删除,并把这个粒子的索引加到“空闲索引”中。
然后,粒子属性从系统内存传输到显示内存中的纹理中后就完全使用GPU在运算和绘制了,粒子信息被保存在纹理中,在绘制的时候先将纹理信息中的所有粒子根据粒子的运动方程计算出粒子运动的轨迹,并根据粒子运动轨迹计算出粒子在下一时刻的位置和速度将计算出来的信息保存到另一组纹理中,然后再根据粒子的存活时间计算粒子下一时刻是否要被删除,如果粒子的达到生存周期,那么在纹理中将粒子的位置信息改为无穷远处,这样会知道屏幕上就看不到已经删除的粒子信息,同一时刻在系统内存中将该粒子从activeParticles“活动粒子堆栈”中删除。
下一个阶段就是生成新粒子,新粒子的生成是根据系统初始化时所设的几个参数—粒子系统的发生率,即每一帧产生多少个新粒子,系统的运行时间,即多长时间绘制一帧所决定的。生成新粒子的过程是先检查“空闲粒子索引”FreeIndices中有没有空闲位置,“空闲粒子索引”FreeIndices是根据纹理大小计算出一个纹理中可以保存多少个粒子的信息而决定的,一般纹理中一个像素的位置保存一个粒子的一种信息,比如用来保存粒子位置信息的纹理,其中一个像素就保存一个粒子的位置信息,像素中的R、G、B分量分别保存粒子位置的X、Y、Z值,所以粒子系统中一共可以绘制多少个粒子,是根据分配纹理的大小决定的,FreeIndices“空闲粒子索引”的大小也是根据纹理大小决定。当FreeIndices“空闲粒子索引”中有空闲索引,就将其索引值取出来,与新产生粒子的位置、速度和生命周期几个属性一同保存在newParticles“新粒子堆栈”和activeParticles“活动粒子堆栈”中,以便后来将其属性值保存在纹理像素中。
这时新粒子的属性都保存在了系统内存中的newParticles“新粒子堆栈”中了,下一步就需要将其从newParticles“新粒子堆栈”中保存到显示内存中的纹理中,也就是显示内存中的Pbuffer中,本发明共有五个Pbuffer,所以,需要将粒子的位置、速度和其他属性分别保存到现实内存中相应的5个Pbuffer中。保存方法就是将对应的Pbuffer的绘制上下文转变为当前系统的绘制上下文,然后进行绘制操作,这样,所有的操作就是绘制在Pbuffer中,也就把数据保存到了相应的Pbuffer中了,保存完成后,清空内存中的“新粒子堆栈”以备下一帧生成新的粒子使用。
粒子属性信息保存到了Pbuffer中,但是当前只有新粒子的属性信息得到了更新,而如果现在系统已经运行了一段时间,其他粒子的信息还没有得到更新,这样,就需要在将新粒子的属性信息保存到相应的Pbuffer上后,还要对目前Pbuffer上的所有的粒子属性信息更新,也就是前述的更新粒子属性,具体方法是首先判断粒子的生存周期,如果粒子到达了生存周期,那么在系统内存中将其删除,粒子的生存周期这时是保存在“活动粒子堆栈”中的,根据系统时间判断粒子的是否到达生存周期的末尾,如果超过时间,则将粒子从“活动粒子堆栈”中删除,并将粒子的索引返回到FreeParticles“空闲粒子索引”中,以供新粒子使用。删除过期粒子后就要对剩余的粒子更新其粒子属性,更新方法是先更新粒子的速度属性,将保存粒子速度属性的那个Pbuffer对绘制上下文设置为当前的绘制上下文,这样进行绘制操作的时候就可以把新的粒子速度值写到相应的Pbuffer中。将粒子的原速度属性纹理和原位置纹理当作数据源读入GPU中,读入方法就是Cg的纹理操作方法,这样,在GPU中可以并行计算粒子的属性值,大大提高计算速度。将计算粒子速度变化的所有参数读入GPU后,系统就根据Cg程序中的计算粒子速度的算法计算每个粒子下一帧的速度,然后将新速度保存在已绑定绘制上下文的Pbuffer中,然后,系统更新粒子的位置属性,这时将保存粒子位置属性的Pbuffer的绘制上下文设置为当前的绘制上下文,因为现在已经更新了粒子的速度属性,这时将粒子的新的速度属性信息与原位置属性信息当作数据源读入GPU中,然后根据S=VT计算出下一帧时粒子的位置,绘制到已绑定的粒子位置纹理中。在这个步骤中,将保存粒子生存周期的纹理读入GPU,计算粒子的生存周期,如果粒子已经超过生存周期,那么将粒子的位置移到屏幕的无穷远处,这样在绘制的时候就不可见了。
更新完粒子的属性后,分别交换保存粒子位置的两个纹理和保存粒子速度属性的两个纹理。在粒子的众多属性中最重要的就是粒子的位置与速度,首先介绍粒子位置的存储方式,如图3所示,纹理中每个像素均是由R、G、B、A四个分量组成的,这样,便可以将粒子的速度分量x、y、z分别保存在纹理的R、G、B分量中,每一个粒子位置信息占用一个像素,如果用256×256大小的纹理,则可以存储65536个粒子的位置信息。这样,把一个二维纹理看作成一个一维数组,纹理坐标作为粒子数组的索引,就可以很方便的读写每一个粒子的属性。由于在绘制期间这个纹理要同时被当作GPU的输入数据与输出目标,而同一个纹理又不能同时作为输入与输出,所以需要同时定义两个相同的纹理形成一组纹理对,即双缓存用来保存粒子的位置信息,纹理对中一个用于读取信息供Cg代码计算,另一个保存计算结果,在下一帧的计算时,调换两个纹理;同理,粒子的速度也存储在这样的一组纹理对中。
在复杂程度相对不高的粒子系统中,粒子除位置与速度属性的其他属性(包括粒子的生存周期、初始位置、大小、颜色、不透明性等)在粒子初始化后只根据很简单的计算便可得知或根本就不再发生改变的,这样,可以用一个单一的纹理来保存这些属性。
更新完粒子属性后就可以绘制粒子了,绘制方法是先将当前的绘制上下文恢复到原来的绘制上下文,这样,绘制的图像就绘制到了帧缓存中。将粒子的位置属性纹理中的粒子位置信息保存到系统内存中的一个顶点数组中,然后使用OpenGL的绘制方法,就可以将粒子根据其位置信息绘制到屏幕上。整个绘制过程十分简单,与一般的图形绘制流程基本一样。
权利要求
1.基于GPU的粒子系统,其特征在于包括下列步骤(1)首先,在系统内存中分配一块存储区域,该存储区域被分为三部分,其中第一部分“空闲索引”用来存储系统可以容纳的所有粒子的索引;第二部分“新粒子堆栈”,用来保存当前产生的新粒子的粒子索引和粒子属性;第三部分“活动粒子堆栈”,用来保存当前系统中总共有多少存活的粒子;(2)从“空闲索引”中读取一个空闲索引与新产生的粒子索引和粒子属性统一保存在“新粒子堆栈”和“活动粒子堆栈”中,生成新粒子;(3)从“新粒子堆栈”中读取新粒子信息保存到显示内存中,其中粒子的速度信息和位置信息保存在第一组纹理中,然后更新粒子的属性;(4)从上述显示内存GPU的一组纹理中读取粒子信息,根据运动方程计算出粒子在下一时刻的位置和速度信息并保存到GPU的第二组纹理中,然后更新粒子信息,包括粒子的速度和位置纹理,如果粒子达到生存周期,在GPU的第一组纹理中将粒子的位置信息改为无穷远处,在系统内存中,将粒子从“活动粒子堆栈”中删除;(5)将更新后的粒子属性从显示内存的纹理中写回到系统内存CPU的顶点数组;(6)绘制粒子。
2.根据权利要求1所述的基于GPU的粒子系统,其特征在于所述显示内存中的两组纹理采用显示内存中的像素缓存Pbuffer来实现。
3.根据权利要求1所述的基于GPU的粒子系统,其特征在于所述显示内存中的像素缓存Pbuffer分为5块,所述的两组纹理占用4块,另一块用于保存粒子的其他不随粒子运动方程改变的属性。
4.根据权利要求1所述的基于GPU的粒子系统,其特征在于所述步骤(3)中的保存方法就是将对应的Pbuffer的绘制上下文转变为当前系统的绘制上下文,然后进行绘制操作。
全文摘要
基于GPU的粒子系统,首先在系统内存CPU中分配一块存储区域,该存储区域分为“空闲索引”、“新粒子堆栈”和“活动粒子堆栈”,三个部分,然后从“空闲索引”中读取一个空闲索引与新产生的粒子索引和粒子属性一同保存在“新粒子堆栈”和“活动粒子堆栈”中,生成新粒子;再从“新粒子堆栈”中读取新粒子信息保存到显示内存中,其中粒子的速度信息和位置信息保存在第一组纹理中,然后更新粒子的属性;显示内存GPU的一组纹理中读取粒子信息,根据运动方程计算出粒子在下一时刻的位置和速度信息并保存到GPU的第二组纹理中,更新粒子信息;将更新后的粒子属性从显示内存的纹理中写回到系统内存CPU的顶点数组;绘制粒子。本发明提高了计算能力和运行效率,同时使系统的实时性能大大提高。
文档编号G06T1/00GK1753031SQ20051008683
公开日2006年3月29日 申请日期2005年11月10日 优先权日2005年11月10日
发明者郝爱民, 许楠, 万丽莉 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1