專利名稱:基于gpu的粒子系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種粒子系統(tǒng),特別是一種基于GPU的粒子系統(tǒng)。
背景技術(shù):
粒子系統(tǒng)是迄今為止被認(rèn)為模擬不規(guī)則模糊物體非常有效的一種圖形生成算法,它采用一種統(tǒng)一的模式來生成諸如云、煙、火、水等具有不規(guī)則形狀的自然現(xiàn)象。在粒子系統(tǒng)中,景象被定義為由成千上萬個(gè)不規(guī)則的、隨機(jī)分布的粒子所組成,而每一個(gè)粒子均有一定的生命周期,它們不斷改變形狀、不斷運(yùn)動(dòng),充分的體現(xiàn)了不規(guī)則物體的性質(zhì)。
但是,粒子系統(tǒng)不是一個(gè)簡單的靜態(tài)系統(tǒng),隨著時(shí)間的推移,系統(tǒng)中已有粒子不僅不斷改變屬性、不斷運(yùn)動(dòng),而且不斷有新粒子的加入,并有舊粒子消失。同時(shí),為使粒子系統(tǒng)所表示的景象具有良好的隨機(jī)性,與粒子有關(guān)的每一參數(shù)均將受到一個(gè)隨機(jī)過程的控制。粒子系統(tǒng)的上述造型方式使得用它來模擬動(dòng)態(tài)自然景象(如水的流動(dòng)、云的漂移等)成為可能。目前現(xiàn)有的用于仿真繪制不定型物的粒子系統(tǒng)的運(yùn)算都是在CPU中進(jìn)行的,每一幀生成的景象均是通過CPU根據(jù)粒子運(yùn)動(dòng)方程計(jì)算內(nèi)存中存儲(chǔ)的粒子屬性,將計(jì)算出的粒子位置信息傳遞給圖形處理單元GPU(Graphic ProcessingUnit)繪制在顯示屏中。
粒子系統(tǒng)可以很方便的仿真模擬不定型物體的運(yùn)動(dòng),因此在目前的三維仿真場景中有很廣泛的應(yīng)用,但是目前大多數(shù)的粒子系統(tǒng)都是基于CPU的,每個(gè)粒子的運(yùn)動(dòng)軌跡都是要通過CPU實(shí)時(shí)計(jì)算出來的,然后再通過數(shù)據(jù)總線將數(shù)據(jù)從系統(tǒng)內(nèi)存?zhèn)鬏數(shù)斤@示硬件中繪制出來,這樣一方面CPU對(duì)于矩陣計(jì)算的能力比較弱,另一方面,將數(shù)據(jù)從CPU傳輸?shù)綀D形處理單元GPU的過程將非常耗時(shí),這就大大降低了粒子系統(tǒng)的實(shí)時(shí)性能。
發(fā)明內(nèi)容
本發(fā)明的技術(shù)解決問題克服現(xiàn)有技術(shù)的不足,提供一種基于GPU的粒子系統(tǒng),它可以提高計(jì)算能力和運(yùn)行效率,同時(shí)使系統(tǒng)的實(shí)時(shí)性能大大提高。
本發(fā)明的技術(shù)解決方案基于GPU的粒子系統(tǒng),其特點(diǎn)在于(1)首先,在系統(tǒng)內(nèi)存CPU中分配一塊存儲(chǔ)區(qū)域,該存儲(chǔ)區(qū)域被分為三部分,其中第一部分“空閑索引”用來存儲(chǔ)系統(tǒng)可以容納的所有粒子的索引;第二部分“新粒子堆?!?,用來保存當(dāng)前產(chǎn)生的新粒子的粒子索引和粒子屬性;第三部分“活動(dòng)粒子堆?!保脕肀4娈?dāng)前系統(tǒng)中總共有多少存活的粒子;(2)從“空閑索引”中讀取一個(gè)空閑索引與新產(chǎn)生的粒子索引和粒子屬性一同保存在“新粒子堆?!焙汀盎顒?dòng)粒子堆?!敝?,生成新粒子;(3)從“新粒子堆棧”中讀取新粒子信息保存到顯示內(nèi)存中,其中粒子的速度信息和位置信息保存在第一組紋理中,然后更新粒子的屬性;(4)從上述顯示內(nèi)存的一組紋理中讀取粒子信息,根據(jù)運(yùn)動(dòng)方程計(jì)算出粒子在下一時(shí)刻的位置和速度信息并保存到顯示內(nèi)存的第二組紋理中,然后更新粒子信息,包括粒子的速度和位置紋理,如果粒子達(dá)到生存周期,在顯示內(nèi)存的第一組紋理中將粒子的位置信息改為無窮遠(yuǎn)處,在系統(tǒng)內(nèi)存中,將粒子從“活動(dòng)粒子堆棧”中刪除;(5)將更新后的粒子屬性從顯示內(nèi)存的紋理中寫回到系統(tǒng)內(nèi)存的頂點(diǎn)數(shù)組;(6)繪制粒子。
所述基于顯示內(nèi)存的兩組紋理采用顯示內(nèi)存中的像素緩存Pbuffer來實(shí)現(xiàn),將Pbuffer分為5塊,其中兩組紋理占用4塊,另一塊用于保存粒子的其他不隨粒子運(yùn)動(dòng)方程改變的屬性。
所述步驟(3)中的保存方法就是將對(duì)應(yīng)的Pbuffer的繪制上下文轉(zhuǎn)變?yōu)楫?dāng)前系統(tǒng)的繪制上下文,然后進(jìn)行繪制操作。
本發(fā)明的原理是將粒子系統(tǒng)中粒子的位置與速度保存在浮點(diǎn)紋理中,以這些紋理作為圖形硬件GPU的輸入與輸出,所有粒子的物理仿真及渲染過程均通過Cg代碼在GPU中實(shí)現(xiàn),這樣就避免了CPU與GPU的頻繁通訊,另一方面利用GPU的多通道并行計(jì)算性能則更加一步的提高了系統(tǒng)的實(shí)時(shí)性。
本發(fā)明與現(xiàn)有技術(shù)相比的優(yōu)點(diǎn)在于(1)本發(fā)明針對(duì)CPU與GPU的數(shù)據(jù)通信是實(shí)時(shí)仿真系統(tǒng)的瓶頸的問題,采用多個(gè)紋理來保存粒子屬性,將屬性的值作為顏色信息存儲(chǔ)在紋理的相應(yīng)位置上,包括粒子速度紋理、位置紋理、其他屬性紋理等,從而大大減少了仿真時(shí)CPU與GPU之間通信的數(shù)據(jù)量,使系統(tǒng)性能得到極大幅度的提升。
(2)本發(fā)明針對(duì)紋理不能同時(shí)作為數(shù)據(jù)輸入與輸出載體的問題,采用雙緩存機(jī)制來存儲(chǔ)粒子的速度與位置屬性,在繪制下一幀時(shí)通過交換緩存來實(shí)現(xiàn)對(duì)紋理的讀寫操作。為了進(jìn)一步解決數(shù)據(jù)通信問題,在GPU中完成計(jì)算粒子的速度與位置屬性的數(shù)據(jù)更新過程,有效利用了GPU的多通道并行計(jì)算能力提高運(yùn)行效率。
(3)本發(fā)明提供對(duì)多種不定型物模擬的支持,用戶只需根據(jù)其物理屬性和運(yùn)動(dòng)模式提供相應(yīng)的屬性和運(yùn)動(dòng)仿真方程,設(shè)定粒子系統(tǒng)的粒子屬性,并且將運(yùn)動(dòng)方程添加到系統(tǒng)提供的框架結(jié)構(gòu)中,即可以實(shí)現(xiàn)對(duì)某一種特定不定型物的仿真。
(4)本發(fā)明針對(duì)屬性紋理的產(chǎn)生與使用方法,采用像素緩存PBuffer來實(shí)現(xiàn)紋理的操作。像素緩存支持應(yīng)用程序在顯示內(nèi)存中產(chǎn)生復(fù)雜的可編程圖像,這些圖像可以被當(dāng)作紋理一樣操作,甚至可以被寫回到系統(tǒng)內(nèi)存中。這樣解決了粒子屬性數(shù)據(jù)的存儲(chǔ)與更新問題。
圖1為本發(fā)明的實(shí)現(xiàn)原理示意圖;圖2為本發(fā)明的系統(tǒng)內(nèi)存的存儲(chǔ)空間分配方式示意圖;圖3為本發(fā)明的粒子屬性存儲(chǔ)方式圖。
具體實(shí)施例方式
如圖1所示,本發(fā)明的系統(tǒng)開始時(shí),首先進(jìn)行初始化,初始化的內(nèi)容主要包括兩個(gè)方面,一個(gè)方面是對(duì)當(dāng)前計(jì)算機(jī)系統(tǒng)和OpenGL擴(kuò)展函數(shù)的初始化,目的是檢查當(dāng)前的計(jì)算機(jī)配置和顯卡驅(qū)動(dòng)程序是否支持必需的OpenGL函數(shù),其中包括對(duì)OpenGL的初始化和聲明在本系統(tǒng)中必要的OpenGL擴(kuò)展函數(shù),OpenGL的擴(kuò)展函數(shù)必須通過wglGetExtensionsStringARB()函數(shù)和wglGetProcAddress()函數(shù)初始化,其中第一個(gè)函數(shù)用于檢查系統(tǒng)是否支持這個(gè)OpenGL擴(kuò)展,第二個(gè)函數(shù)用于得到函數(shù)指針;系統(tǒng)初始化的第二個(gè)方面是使用第一部分聲明的OpenGL擴(kuò)展函數(shù)初始化像素緩存Pbuffer。
由于本發(fā)明使用紋理存儲(chǔ)粒子系統(tǒng)的各種屬性,所以對(duì)系統(tǒng)紋理的設(shè)計(jì)和使用是本系統(tǒng)的重點(diǎn)。本系統(tǒng)使用像素緩存Pbuffer充當(dāng)紋理來存儲(chǔ)粒子的屬性,Pbuffer是顯示內(nèi)存中的一部分,應(yīng)進(jìn)行初始化生成Pbuffer。初始化Pbuffer的過程是首先,在顯示內(nèi)存中劃分幾塊區(qū)域用來當(dāng)作Pbuffer,本系統(tǒng)中劃分至少5塊,其中兩塊用于保存粒子的速度屬性,兩塊用來保存粒子的位置屬性,最后一塊用于保存粒子的其他不隨粒子運(yùn)動(dòng)方程改變的屬性(粒子的生存時(shí)間等),然后初始化每一個(gè)Pbuffer,初始化每個(gè)Pbuffer的過程是先將系統(tǒng)的繪制上下文指定到相應(yīng)的Pbuffer上,因?yàn)镻buffer是在顯示內(nèi)存中的一部分,所以Pbuffe就可以當(dāng)作幀緩存來使用,也就是說可以通過繪制過程將數(shù)據(jù)繪制到Pbuffer上,也可以通過讀取幀緩存數(shù)據(jù)的方法讀取Pbuffer中的像素?cái)?shù)據(jù),將繪制上下文指定到一個(gè)Pbuffer上后,以后所有的繪制工作就是對(duì)這個(gè)Pbuffer的操作了,所以本發(fā)明可以將粒子的速度、位置及其他屬性信息保存到相應(yīng)的Pbuffer中。在初始化這個(gè)步驟當(dāng)中,還沒有實(shí)際的粒子屬性信息,但可以通過這個(gè)步驟將顯示內(nèi)存中的Pbuffer規(guī)格化,讓其擁有固定的數(shù)據(jù)結(jié)構(gòu),以備過后的數(shù)據(jù)保存。
初始化Pbuffer后,本發(fā)明還需要在系統(tǒng)內(nèi)存中分配一塊內(nèi)存空間,如圖2所示,這塊內(nèi)存空間又被分為FreeIndices、newParticles和activeParticles三個(gè)部分,其中FreeIndices為“空閑索引”,用來存儲(chǔ)系統(tǒng)可以容納的所有粒子的索引,newParticles“新粒子堆?!庇脕肀4娈?dāng)前產(chǎn)生的新粒子的粒子索引和粒子屬性,在繪制每一幀時(shí)都要更新這個(gè)部分,將當(dāng)前幀要產(chǎn)生的粒子送到顯示內(nèi)存的紋理中,再將下一幀所要產(chǎn)生的粒子的信息更新到“新粒子堆?!敝?,activeParticles“活動(dòng)粒子堆棧”,用來保存當(dāng)前系統(tǒng)中總共有多少存活的粒子,系統(tǒng)在每一幀繪制完成后計(jì)算各個(gè)存活粒子的生存周期,對(duì)于超過生存時(shí)間的粒子,在系統(tǒng)內(nèi)存中將粒子從“活動(dòng)粒子堆棧”中刪除,并把這個(gè)粒子的索引加到“空閑索引”中。
然后,粒子屬性從系統(tǒng)內(nèi)存?zhèn)鬏數(shù)斤@示內(nèi)存中的紋理中后就完全使用GPU在運(yùn)算和繪制了,粒子信息被保存在紋理中,在繪制的時(shí)候先將紋理信息中的所有粒子根據(jù)粒子的運(yùn)動(dòng)方程計(jì)算出粒子運(yùn)動(dòng)的軌跡,并根據(jù)粒子運(yùn)動(dòng)軌跡計(jì)算出粒子在下一時(shí)刻的位置和速度將計(jì)算出來的信息保存到另一組紋理中,然后再根據(jù)粒子的存活時(shí)間計(jì)算粒子下一時(shí)刻是否要被刪除,如果粒子的達(dá)到生存周期,那么在紋理中將粒子的位置信息改為無窮遠(yuǎn)處,這樣會(huì)知道屏幕上就看不到已經(jīng)刪除的粒子信息,同一時(shí)刻在系統(tǒng)內(nèi)存中將該粒子從activeParticles“活動(dòng)粒子堆棧”中刪除。
下一個(gè)階段就是生成新粒子,新粒子的生成是根據(jù)系統(tǒng)初始化時(shí)所設(shè)的幾個(gè)參數(shù)—粒子系統(tǒng)的發(fā)生率,即每一幀產(chǎn)生多少個(gè)新粒子,系統(tǒng)的運(yùn)行時(shí)間,即多長時(shí)間繪制一幀所決定的。生成新粒子的過程是先檢查“空閑粒子索引”FreeIndices中有沒有空閑位置,“空閑粒子索引”FreeIndices是根據(jù)紋理大小計(jì)算出一個(gè)紋理中可以保存多少個(gè)粒子的信息而決定的,一般紋理中一個(gè)像素的位置保存一個(gè)粒子的一種信息,比如用來保存粒子位置信息的紋理,其中一個(gè)像素就保存一個(gè)粒子的位置信息,像素中的R、G、B分量分別保存粒子位置的X、Y、Z值,所以粒子系統(tǒng)中一共可以繪制多少個(gè)粒子,是根據(jù)分配紋理的大小決定的,F(xiàn)reeIndices“空閑粒子索引”的大小也是根據(jù)紋理大小決定。當(dāng)FreeIndices“空閑粒子索引”中有空閑索引,就將其索引值取出來,與新產(chǎn)生粒子的位置、速度和生命周期幾個(gè)屬性一同保存在newParticles“新粒子堆?!焙蚢ctiveParticles“活動(dòng)粒子堆?!敝?,以便后來將其屬性值保存在紋理像素中。
這時(shí)新粒子的屬性都保存在了系統(tǒng)內(nèi)存中的newParticles“新粒子堆?!敝辛?,下一步就需要將其從newParticles“新粒子堆棧”中保存到顯示內(nèi)存中的紋理中,也就是顯示內(nèi)存中的Pbuffer中,本發(fā)明共有五個(gè)Pbuffer,所以,需要將粒子的位置、速度和其他屬性分別保存到現(xiàn)實(shí)內(nèi)存中相應(yīng)的5個(gè)Pbuffer中。保存方法就是將對(duì)應(yīng)的Pbuffer的繪制上下文轉(zhuǎn)變?yōu)楫?dāng)前系統(tǒng)的繪制上下文,然后進(jìn)行繪制操作,這樣,所有的操作就是繪制在Pbuffer中,也就把數(shù)據(jù)保存到了相應(yīng)的Pbuffer中了,保存完成后,清空內(nèi)存中的“新粒子堆?!币詡湎乱粠尚碌牧W邮褂谩?br>
粒子屬性信息保存到了Pbuffer中,但是當(dāng)前只有新粒子的屬性信息得到了更新,而如果現(xiàn)在系統(tǒng)已經(jīng)運(yùn)行了一段時(shí)間,其他粒子的信息還沒有得到更新,這樣,就需要在將新粒子的屬性信息保存到相應(yīng)的Pbuffer上后,還要對(duì)目前Pbuffer上的所有的粒子屬性信息更新,也就是前述的更新粒子屬性,具體方法是首先判斷粒子的生存周期,如果粒子到達(dá)了生存周期,那么在系統(tǒng)內(nèi)存中將其刪除,粒子的生存周期這時(shí)是保存在“活動(dòng)粒子堆?!敝械模鶕?jù)系統(tǒng)時(shí)間判斷粒子的是否到達(dá)生存周期的末尾,如果超過時(shí)間,則將粒子從“活動(dòng)粒子堆?!敝袆h除,并將粒子的索引返回到FreeParticles“空閑粒子索引”中,以供新粒子使用。刪除過期粒子后就要對(duì)剩余的粒子更新其粒子屬性,更新方法是先更新粒子的速度屬性,將保存粒子速度屬性的那個(gè)Pbuffer對(duì)繪制上下文設(shè)置為當(dāng)前的繪制上下文,這樣進(jìn)行繪制操作的時(shí)候就可以把新的粒子速度值寫到相應(yīng)的Pbuffer中。將粒子的原速度屬性紋理和原位置紋理當(dāng)作數(shù)據(jù)源讀入GPU中,讀入方法就是Cg的紋理操作方法,這樣,在GPU中可以并行計(jì)算粒子的屬性值,大大提高計(jì)算速度。將計(jì)算粒子速度變化的所有參數(shù)讀入GPU后,系統(tǒng)就根據(jù)Cg程序中的計(jì)算粒子速度的算法計(jì)算每個(gè)粒子下一幀的速度,然后將新速度保存在已綁定繪制上下文的Pbuffer中,然后,系統(tǒng)更新粒子的位置屬性,這時(shí)將保存粒子位置屬性的Pbuffer的繪制上下文設(shè)置為當(dāng)前的繪制上下文,因?yàn)楝F(xiàn)在已經(jīng)更新了粒子的速度屬性,這時(shí)將粒子的新的速度屬性信息與原位置屬性信息當(dāng)作數(shù)據(jù)源讀入GPU中,然后根據(jù)S=VT計(jì)算出下一幀時(shí)粒子的位置,繪制到已綁定的粒子位置紋理中。在這個(gè)步驟中,將保存粒子生存周期的紋理讀入GPU,計(jì)算粒子的生存周期,如果粒子已經(jīng)超過生存周期,那么將粒子的位置移到屏幕的無窮遠(yuǎn)處,這樣在繪制的時(shí)候就不可見了。
更新完粒子的屬性后,分別交換保存粒子位置的兩個(gè)紋理和保存粒子速度屬性的兩個(gè)紋理。在粒子的眾多屬性中最重要的就是粒子的位置與速度,首先介紹粒子位置的存儲(chǔ)方式,如圖3所示,紋理中每個(gè)像素均是由R、G、B、A四個(gè)分量組成的,這樣,便可以將粒子的速度分量x、y、z分別保存在紋理的R、G、B分量中,每一個(gè)粒子位置信息占用一個(gè)像素,如果用256×256大小的紋理,則可以存儲(chǔ)65536個(gè)粒子的位置信息。這樣,把一個(gè)二維紋理看作成一個(gè)一維數(shù)組,紋理坐標(biāo)作為粒子數(shù)組的索引,就可以很方便的讀寫每一個(gè)粒子的屬性。由于在繪制期間這個(gè)紋理要同時(shí)被當(dāng)作GPU的輸入數(shù)據(jù)與輸出目標(biāo),而同一個(gè)紋理又不能同時(shí)作為輸入與輸出,所以需要同時(shí)定義兩個(gè)相同的紋理形成一組紋理對(duì),即雙緩存用來保存粒子的位置信息,紋理對(duì)中一個(gè)用于讀取信息供Cg代碼計(jì)算,另一個(gè)保存計(jì)算結(jié)果,在下一幀的計(jì)算時(shí),調(diào)換兩個(gè)紋理;同理,粒子的速度也存儲(chǔ)在這樣的一組紋理對(duì)中。
在復(fù)雜程度相對(duì)不高的粒子系統(tǒng)中,粒子除位置與速度屬性的其他屬性(包括粒子的生存周期、初始位置、大小、顏色、不透明性等)在粒子初始化后只根據(jù)很簡單的計(jì)算便可得知或根本就不再發(fā)生改變的,這樣,可以用一個(gè)單一的紋理來保存這些屬性。
更新完粒子屬性后就可以繪制粒子了,繪制方法是先將當(dāng)前的繪制上下文恢復(fù)到原來的繪制上下文,這樣,繪制的圖像就繪制到了幀緩存中。將粒子的位置屬性紋理中的粒子位置信息保存到系統(tǒng)內(nèi)存中的一個(gè)頂點(diǎn)數(shù)組中,然后使用OpenGL的繪制方法,就可以將粒子根據(jù)其位置信息繪制到屏幕上。整個(gè)繪制過程十分簡單,與一般的圖形繪制流程基本一樣。
權(quán)利要求
1.基于GPU的粒子系統(tǒng),其特征在于包括下列步驟(1)首先,在系統(tǒng)內(nèi)存中分配一塊存儲(chǔ)區(qū)域,該存儲(chǔ)區(qū)域被分為三部分,其中第一部分“空閑索引”用來存儲(chǔ)系統(tǒng)可以容納的所有粒子的索引;第二部分“新粒子堆?!保脕肀4娈?dāng)前產(chǎn)生的新粒子的粒子索引和粒子屬性;第三部分“活動(dòng)粒子堆棧”,用來保存當(dāng)前系統(tǒng)中總共有多少存活的粒子;(2)從“空閑索引”中讀取一個(gè)空閑索引與新產(chǎn)生的粒子索引和粒子屬性統(tǒng)一保存在“新粒子堆?!焙汀盎顒?dòng)粒子堆棧”中,生成新粒子;(3)從“新粒子堆?!敝凶x取新粒子信息保存到顯示內(nèi)存中,其中粒子的速度信息和位置信息保存在第一組紋理中,然后更新粒子的屬性;(4)從上述顯示內(nèi)存GPU的一組紋理中讀取粒子信息,根據(jù)運(yùn)動(dòng)方程計(jì)算出粒子在下一時(shí)刻的位置和速度信息并保存到GPU的第二組紋理中,然后更新粒子信息,包括粒子的速度和位置紋理,如果粒子達(dá)到生存周期,在GPU的第一組紋理中將粒子的位置信息改為無窮遠(yuǎn)處,在系統(tǒng)內(nèi)存中,將粒子從“活動(dòng)粒子堆?!敝袆h除;(5)將更新后的粒子屬性從顯示內(nèi)存的紋理中寫回到系統(tǒng)內(nèi)存CPU的頂點(diǎn)數(shù)組;(6)繪制粒子。
2.根據(jù)權(quán)利要求1所述的基于GPU的粒子系統(tǒng),其特征在于所述顯示內(nèi)存中的兩組紋理采用顯示內(nèi)存中的像素緩存Pbuffer來實(shí)現(xiàn)。
3.根據(jù)權(quán)利要求1所述的基于GPU的粒子系統(tǒng),其特征在于所述顯示內(nèi)存中的像素緩存Pbuffer分為5塊,所述的兩組紋理占用4塊,另一塊用于保存粒子的其他不隨粒子運(yùn)動(dòng)方程改變的屬性。
4.根據(jù)權(quán)利要求1所述的基于GPU的粒子系統(tǒng),其特征在于所述步驟(3)中的保存方法就是將對(duì)應(yīng)的Pbuffer的繪制上下文轉(zhuǎn)變?yōu)楫?dāng)前系統(tǒng)的繪制上下文,然后進(jìn)行繪制操作。
全文摘要
基于GPU的粒子系統(tǒng),首先在系統(tǒng)內(nèi)存CPU中分配一塊存儲(chǔ)區(qū)域,該存儲(chǔ)區(qū)域分為“空閑索引”、“新粒子堆棧”和“活動(dòng)粒子堆?!保齻€(gè)部分,然后從“空閑索引”中讀取一個(gè)空閑索引與新產(chǎn)生的粒子索引和粒子屬性一同保存在“新粒子堆?!焙汀盎顒?dòng)粒子堆棧”中,生成新粒子;再從“新粒子堆?!敝凶x取新粒子信息保存到顯示內(nèi)存中,其中粒子的速度信息和位置信息保存在第一組紋理中,然后更新粒子的屬性;顯示內(nèi)存GPU的一組紋理中讀取粒子信息,根據(jù)運(yùn)動(dòng)方程計(jì)算出粒子在下一時(shí)刻的位置和速度信息并保存到GPU的第二組紋理中,更新粒子信息;將更新后的粒子屬性從顯示內(nèi)存的紋理中寫回到系統(tǒng)內(nèi)存CPU的頂點(diǎn)數(shù)組;繪制粒子。本發(fā)明提高了計(jì)算能力和運(yùn)行效率,同時(shí)使系統(tǒng)的實(shí)時(shí)性能大大提高。
文檔編號(hào)G06T1/00GK1753031SQ20051008683
公開日2006年3月29日 申請(qǐng)日期2005年11月10日 優(yōu)先權(quán)日2005年11月10日
發(fā)明者郝愛民, 許楠, 萬麗莉 申請(qǐng)人:北京航空航天大學(xué)