陳顯軍, 李心穎, 湛永松
(1. 海口經(jīng)濟(jì)學(xué)院信息工程學(xué)院,海南 ???570203;2. 桂林電子科技大學(xué)計算機(jī)科學(xué)與工程學(xué)院,廣西 桂林 541004)
在計算機(jī)游戲設(shè)計領(lǐng)域,各種特效的模擬一 直是其研究熱點之一。大多數(shù)特效現(xiàn)象都具有形狀不規(guī)則及隨機(jī)多變的特性,難以使用傳統(tǒng)的計算機(jī)圖形學(xué)方法建模。粒子系統(tǒng)具有能實時模擬不規(guī)則物體的優(yōu)勢。隨著現(xiàn)代計算機(jī)硬件性能的提高,各種粒子系統(tǒng)和粒子特效的復(fù)雜度也隨之提高,并成為計算機(jī)游戲開發(fā)過程中特效繪制的一種必要機(jī)制。但傳統(tǒng)的粒子系統(tǒng)存在難以精確控制和運算量大的問題,導(dǎo)致動畫師難以實時獲得隨心所欲的特效設(shè)計效果。
粒子系統(tǒng)是 Reeves[1]在 1983年所提出,其基本思路是將景物看作由不規(guī)則的、隨機(jī)分布的粒子組成,每個粒子均具有大小、顏色、質(zhì)量、位置、速度及生命周期等屬性,隨著時間推移,粒子不斷運動和改變形狀,而且此過程中不斷有新粒子加入和舊粒子消失,各粒子狀態(tài)的改變導(dǎo)致整個粒子群形態(tài)的改變。之后,Perry[2]建立了一個增強(qiáng)的粒子系統(tǒng),即利用動態(tài)變化的幾何體代替靜態(tài)的基本圖元和像元來實現(xiàn)粒子的實時繪制,并且還在系統(tǒng)中加入了火焰蔓延效果模擬。Beaudoin[3]在上述系統(tǒng)的基礎(chǔ)上,通過加入形體方程來模擬火的造型,并提出了在多邊形上實現(xiàn)火焰蔓延的算法。Lee[4]在構(gòu)建模型中則考慮了風(fēng)場和坡度等影響因子,然后用傳統(tǒng)的粒子系統(tǒng)方法實現(xiàn)了火焰在地形上的蔓延效果。King[5]構(gòu)建了一種基于粒子系統(tǒng)的實時模擬系統(tǒng),通過textured splats的方法繪制粒子,有利于大大減少繪制所需的粒子數(shù)。湛永松[6]提出一種流體力學(xué)模型結(jié)合粒子系統(tǒng)的卡通煙霧實時模擬算法,通過為粒子屬性引入濃度函數(shù)和作用半徑,從而只需少量粒子就可快速獲得煙霧濃度場分布,并使用代表動畫師個人風(fēng)格的卡通圖元進(jìn)行紋理貼圖以實現(xiàn)卡通化效果。Wei[7]用textured splats原理實現(xiàn)了火焰的繪制,并利用 LBM(Lattice Boltzmann Model)模型的線性和邏輯性特征來增強(qiáng)火焰模擬的物理真實感和繪制實時性。
在另一方面,隨著計算技術(shù)和集成電路技術(shù)的發(fā)展,圖形硬件的更新速度迅猛。自從NVidia公司在 1999年提出 GPU(Graphics Processing Unit)的概念后,其發(fā)展速度極大超越了摩爾定律。GPU內(nèi)部像素級的紋元能夠參與編程運算,在某種程度上模擬了類似于Pixel Plane處理單元的部分功能,而且向著通用計算[8]的方向發(fā)展?;?GPU 的通用計算(General-Purpose Computation on Graphics Hardware, GPGPU)即是利用 GPU來實現(xiàn)矢量、矩陣的基本代數(shù)運算,然后在這個基礎(chǔ)上完成一些相對復(fù)雜的運算,如雅克比迭代、偏微分方程、線性方程組的求解,從而實現(xiàn)對復(fù)雜應(yīng)用問題的處理[9-10]。
為了提高粒子系統(tǒng)的可控性并改善計算機(jī)游戲特效的生成速率,本文提出一種 GPU支持下通過粒子系統(tǒng)編輯器實現(xiàn)的特效生成技術(shù)。通過粒子系統(tǒng)編輯器有效提高粒子系統(tǒng)制作的可控性,并在圖形處理器 GPU上對大規(guī)模粒子進(jìn)行仿真和繪制,以保持實時的渲染幀率,最終確保了特效設(shè)計的可控性和實時性要求。
本文所使用的粒子系統(tǒng)編輯器是基于OGRE圖形引擎開發(fā),具有兩個主要功能:首先是對粒子系統(tǒng)的生命周期、系統(tǒng)最多允許粒子數(shù)、是否進(jìn)行渲染排序、粒子系統(tǒng)渲染屬性、粒子發(fā)射器的形狀和個數(shù)、粒子發(fā)射器的發(fā)射方向和發(fā)射方式、發(fā)射頻率等行為屬性進(jìn)行實時編輯;其次是設(shè)定粒子系統(tǒng)中所有粒子的某些公共行為屬性,包括粒子的初始速度范圍、粒子加速度及其變化方式、粒子個體的生命周期、單粒子的紋理貼圖等。通過粒子系統(tǒng)編輯器能對粒子系統(tǒng)的各種屬性進(jìn)行所見即所得的實時編輯,從而提高了特效開發(fā)過程的可控性。
該系統(tǒng)采取基于XBOX360的GPU程序設(shè)計進(jìn)行主要仿真計算,粒子的渲染繪制及物理運動模擬都由 GPU運算完成。作為一種具有專用圖形管道的游戲控制臺,XBOX360所使用的圖形渲染API是DirectX9.0渲染庫的一個改進(jìn)版,其頂點渲染器(Vertex Shader)和像素渲染器(Pixel Shader)分別采用vs3.0和ps3.0標(biāo)準(zhǔn),所包含的指令集非常完備,GPU完成通用運算的效率也更高,有利于提高特效的生成速率。系統(tǒng)整體框架如圖1所示。針對GPU程序特定的數(shù)據(jù)流程和程序運行方式,可將該系統(tǒng)分成如下三個子系統(tǒng)。
(1)粒子系統(tǒng)編輯器。作為一個交互式的粒子系統(tǒng)開發(fā)環(huán)境,該子系統(tǒng)主要用于采集用戶為待編輯粒子系統(tǒng)設(shè)置的各種參數(shù),是系統(tǒng)可編輯性和可控性的直接體現(xiàn),并將采集到的粒子系統(tǒng)的各種設(shè)置參數(shù)保存到一個粒子系統(tǒng)描述文件中或者直接用于粒子系統(tǒng)的參數(shù)設(shè)置。
(2)粒子系統(tǒng)生成器。通過解析粒子系統(tǒng)描述模板文件,該子系統(tǒng)負(fù)責(zé)提取各種參數(shù)設(shè)置并構(gòu)建粒子系統(tǒng),然后進(jìn)行系統(tǒng)初始化。
(3)粒子系統(tǒng)仿真引擎。該子系統(tǒng)負(fù)責(zé)驅(qū)動粒子系統(tǒng)的仿真循環(huán),每一循環(huán)包括狀態(tài)更新、仿真模擬以及繪制渲染等3個部分。
圖1 系統(tǒng)框架圖
粒子系統(tǒng)編輯器和粒子系統(tǒng)生成器是整個系統(tǒng)的前端,負(fù)責(zé)完成用戶交互及仿真系統(tǒng)的預(yù)處理工作。 粒子系統(tǒng)的行為屬性和渲染屬性是通過粒子系統(tǒng)模板進(jìn)行規(guī)范。該模板是通過粒子系統(tǒng)編輯器生成,并作為可重用的游戲特效構(gòu)件。粒子系統(tǒng)編輯可分為離線編輯和實時編輯,前者是在PC機(jī)上運行粒子編輯器,并將編輯的結(jié)果保存到一個粒子系統(tǒng)描述模板文件;后者是在XBOX360上運行粒子系統(tǒng)編輯器以實時編輯運行中的粒子仿真子系統(tǒng),根據(jù)用戶指令實時調(diào)整粒子系統(tǒng)的各種屬性,并將仿真效果實時反饋出來,從而獲得所見即所得的編輯效果。
粒子系統(tǒng)模板是粒子系統(tǒng)編輯器和粒子系統(tǒng)生成器之間的接口,粒子系統(tǒng)生成器根據(jù)該模板描述構(gòu)建出相應(yīng)的粒子系統(tǒng)。粒子系統(tǒng)模板首先需要通過粒子模板解析器進(jìn)行解析,然后解析器抽取出粒子系統(tǒng)的參數(shù)屬性以構(gòu)建粒子系統(tǒng)的機(jī)器表示,包括:粒子系統(tǒng)的狀態(tài)跟蹤系統(tǒng)結(jié)構(gòu)、粒子系統(tǒng)的渲染屬性數(shù)據(jù)結(jié)構(gòu)、粒子群的狀態(tài)跟蹤數(shù)據(jù)結(jié)構(gòu)等。由于粒子群中每個粒子的運動狀態(tài)和渲染狀態(tài)都是通過 GPU運算完成,因此粒子群的狀態(tài)跟蹤數(shù)據(jù)結(jié)構(gòu)必須能被 GPU進(jìn)行讀寫。在本系統(tǒng)中,通過將紋理貼圖作為數(shù)據(jù)集,并將粒子群狀態(tài)進(jìn)行相應(yīng)編碼再存儲到紋理貼圖上,以便于 GPU在仿真過程中進(jìn)行數(shù)據(jù)采集和計算結(jié)果輸出。
粒子系統(tǒng)仿真引擎包括粒子系統(tǒng)控制器和GPU粒子模擬引擎。粒子系統(tǒng)控制器負(fù)責(zé)跟蹤粒子系統(tǒng)的生命周期及隨時間變化的系統(tǒng)渲染屬性更新,同時根據(jù)粒子發(fā)射器的屬性進(jìn)行粒子生成和銷毀。GPU粒子模擬引擎主要進(jìn)行粒子運動模擬和粒子狀態(tài)更新,并完成最終渲染。該仿真引擎的核心是粒子控制器對粒子系統(tǒng)各種狀態(tài)、行為的更新過程以及 GPU端的物理運動模擬和圖形渲染過程。GPU粒子模擬仿真是一個雙通道過程,第一個過程主要進(jìn)行粒子物理運動的仿真模擬和粒子狀態(tài)的更新,并在視覺空間中對粒子進(jìn)行排序;第二個過程是對排序后的粒子進(jìn)行渲染。
作為粒子系統(tǒng)仿真過程的控制中心,粒子系統(tǒng)控制器負(fù)責(zé)粒子系統(tǒng)各種行為的驅(qū)動和渲染屬性的更新。進(jìn)行跟蹤的粒子系統(tǒng)行為主要包括粒子系統(tǒng)的生命周期、粒子發(fā)射器的運作等。在每一個渲染幀,粒子系統(tǒng)控制器都測試粒子系統(tǒng)的生命周期以判定仿真過程是否結(jié)束,并根據(jù)用戶設(shè)定的規(guī)則驅(qū)動所有粒子發(fā)射器進(jìn)行新粒子的發(fā)射和舊粒子的銷毀。此外,粒子系統(tǒng)控制器必須為 GPU模擬仿真進(jìn)行參數(shù)設(shè)置,包括作為粒子屬性存儲的紋理貼圖的設(shè)定、渲染參數(shù)設(shè)定等。粒子系統(tǒng)控制器的工作流程如圖2所示。
圖2 粒子控制器工作流程圖
基于 GPU的通用計算所采取的數(shù)據(jù)輸入輸出方式是紋理貼圖。通過將粒子仿真計算所得的參數(shù)進(jìn)行特定編碼,然后保存于紋理貼圖中,以供 GPU運算時進(jìn)行輸入提取,而計算結(jié)果也以特定編碼的紋理貼圖形式輸出。由于 XBOX360中像素渲染器的輸出只能指派到四個渲染目標(biāo)上,因此輸入和輸出過程所采用的紋理貼圖并不相同。進(jìn)行仿真計算時將粒子的位置、速度和其它的一些相關(guān)屬性分別存放在不同的紋理貼圖上,粒子仿真模擬引擎從位置和速度紋理貼圖上讀取粒子的當(dāng)前位置與速度,并根據(jù)物理仿真公式計算下一幀的位置與速度,最后輸出到新的位置和速度紋理貼圖上。
基于 GPU的粒子系統(tǒng)的重要功能是使用GPU進(jìn)行粒子的物理運動模擬運算和各種行為和渲染狀態(tài)的更新。從圖3可知本系統(tǒng)將粒子位置、速度和渲染狀態(tài)分別編碼到不同的紋理貼圖中,并對計算結(jié)果中的粒子速度和空間位置進(jìn)行編碼,然后輸出到新的紋理貼圖上。粒子速度和位置的更新在第一個渲染過程的像素渲染器中完成。速度和位置的計算公式如下
上式中,Vt是上一幀的速度,Vt+Δt是當(dāng)前幀待計算的速度,a為粒子加速度,tP是上一幀的位移,Pt+Δt是當(dāng)前幀待計算的位移。位移也可采取式(3)計算。
在系統(tǒng)實現(xiàn)過程中,使用式(2)計算位移時,紋理貼圖里存儲的是位移和速度;而使用式(3)計算位移時,紋理貼圖中儲存的是前兩幀的位移,因而不同的位移計算方法會給系統(tǒng)實現(xiàn)帶來細(xì)微差異。
除了粒子的速度和空間位置,粒子系統(tǒng)中每個粒子都具有大小、朝向、材質(zhì)、貼圖、顏色等多個屬性。這些屬性可以是靜態(tài)或動態(tài),如果某些屬性會發(fā)生變化,則第一個渲染過程還需要對相應(yīng)的屬性進(jìn)行更新,例如根據(jù)粒子的年齡控制其大小、透明度、顏色等屬性。
XBOX360是一種能進(jìn)行高效圖形處理和游戲開發(fā)的系統(tǒng),其CPU和GPU具有一些有利于實時交互性計算和圖形圖像處理的特殊功能。XBOX360的CPU是一個三核的處理單元,每個計算內(nèi)核同時包含兩個硬件線程,兩個內(nèi)核能同時共享相同的一級緩存,使得這三個獨立的處理單元能并行運算,從而提高了計算效率。此外,獨立的功能模塊可被分配到不同的硬件線程上以進(jìn)行并行計算,例如將多個粒子系統(tǒng)同時指派到不同的內(nèi)核線程上,從而實現(xiàn)并行模擬。XBOX360提供了多種不同的內(nèi)存預(yù)取指令,該系統(tǒng)使用dcbt預(yù)取指令對粒子系統(tǒng)在CPU端的排序進(jìn)行優(yōu)化。XBOX360的GPU也提供有許多優(yōu)化處理指令。在使用頂點渲染器進(jìn)行物理仿真時,該系統(tǒng)采用了UseTextureCache=true微指令來指示GPU從紋理顯存中讀取頂點數(shù)據(jù),從而允許紋理提取單元和頂點數(shù)據(jù)提取單元并行工作。另外,由于第一個渲染過程將仿真結(jié)果輸出到AGP顯存中的渲染目標(biāo)上,但AGP顯存中的紋理貼圖在CPU端的處理效率較低,因此XBOX360提供了一個更高效的渲染輸出指令memexport,可直接將像素渲染器輸出的數(shù)據(jù)寫入到一個指定的系統(tǒng)內(nèi)存中,從而提高了系統(tǒng)效率。
圖3所示為使用該系統(tǒng)進(jìn)行粒子屬性編輯的操作界面??梢钥吹?,其界面為用戶提供了易于理解的高層語義參數(shù),允許動畫師高效、直觀地設(shè)定粒子系統(tǒng)參數(shù),從而對粒子發(fā)射器的物理控制屬性和粒子系統(tǒng)的渲染屬性實時進(jìn)行所見即所得的編輯效果。
圖3 粒子系統(tǒng)編輯器工作界面
由于系統(tǒng)引入了多種優(yōu)化策略,能在XBOX360上達(dá)到很高的實時幀率。此外,該系統(tǒng)支持多個粒子系統(tǒng)同時編輯和載入,從而有效簡化了復(fù)雜粒子系統(tǒng)及粒子特效的制作過程。表1給出了本系統(tǒng)在不同幀率和分辨率下所需要的粒子數(shù)??梢娫诒3謱崟r幀率和 720p分辨率的前提下,該系統(tǒng)可采用的最大仿真粒子數(shù)能達(dá)到10萬以上,有力提高了特效畫面的細(xì)節(jié)效果。圖4所示為該系統(tǒng)同時渲染三個粒子特效所產(chǎn)生的視覺效果。可以看到,在保持較精確控制性的同時,該系統(tǒng)能獲得實時的視覺效果,進(jìn)而很好地滿足了動畫師對特效設(shè)計過程提出的特定需求。
表1 系統(tǒng)在不同幀率和分辨率下所需粒子數(shù)
圖4 三個同時渲染的粒子特效
本文提出了一種基于粒子系統(tǒng)編輯器進(jìn)行精確編輯,并通過 GPU完成實時渲染的的粒子特效生成方法。采用粒子系統(tǒng)編輯器能夠提高粒子系統(tǒng)開發(fā)制作的可控性和精確度,基于 GPU的仿真和繪制則可保證對大規(guī)模粒子系統(tǒng)渲染的實時性。這兩種技術(shù)相結(jié)合能確保粒子特效開發(fā)制作的可控性和實時性要求。
在未來的工作中,該系統(tǒng)將考慮引入一個粒子系統(tǒng)編輯框架,以使得任何粒子系統(tǒng)都可以插件的形式載入到編輯器中,從而進(jìn)行更為便捷的實時編輯。
[1]Reeves W T. Particle systems-A technique for modeling a class of fuzzy objects [J]. Computer Graphics, 1983,17 (3): 359-376.
[2]Perry C H, Picard R W. Synthesizing flames and their spreading [C]//Proceedings of 5th. Eurographics Workshop on Animation and Simulation, 1994: 56-66.
[3]Beaudoin P, Paquet S, Poulin P. Realistic and controllable fire simulation [C]//Proceedings of Graphics Interface, 2001: 159-166.
[4]Lee H, Kim L, Meyer M, et al. Meshes on fire [C]//EuroGraphics Workshop on Animation, 2001: 75-84.
[5]King S A, Crawfis R A, Reid W. Fast animation of amorphous and gaseous phenomena [C]//Proceedings of Volume Graphics’99, 1999: 333-346.
[6]湛永松, 石民勇, 費廣正. 基于物理模型的實時卡通煙霧模擬算法[J]. 中國圖象圖形學(xué)報, 2007, 14(2):261-265.
[7]Wei X, Li W, Mueller K, et al. Simulating fire with texture splats [C]//Proceedings of 13th IEEE Visualization 2002 Conference, 2002: 227-234.
[9]Harris M. Simulation of cloud dynamics on graphics hardware [C]//Proceedings of Graphics Hardware,2003: 92-101.
[10]湛永松, 楊明浩, 石民勇, 等. 基于可編程圖形處理器的實時煙霧控制模擬[J]. 工程圖學(xué)學(xué)報, 2008,29(4): 60-64.