摘要:森林場景的實時渲染仍然是圖形學領域的一大難題。針對森林場景的復雜性和大數據量等特點,該文在OGRE圖形引擎的基礎上,通過八叉樹結合OGRE中的靜態幾何體的方法實現大規模森林場景的實時渲染。實驗結果表明通過這種方法能夠在實時渲染的基礎上仍能保持較好的視覺效果。
關鍵詞:森林場景;實時渲染;八叉樹;靜態幾何;OGRE
中圖分類號:TP391文獻標識碼:A文章編號:1009-3044(2008)26-1613-02
Research of Rendering of Forest Scene Based on OGRE Graphic Engine
WU Yong
(School of Software Engineering, Tongji University, Shanghai 200092, China)
Abstract: Rendering a forest scene in real-time is still a great challenge in the field of Computer Graphics. Due to the complexity and massive data in forest scene, this paper expose a way that using both of Octree and Static Geometry based on OGRE graphic engine to render large scale forest scene in real-time. The experiment we did by this way show that we can get a good visual quality while maintaining high frame rates.
Key words: Forest scene; Real-time rendering; Octree; Static geometry; OGRE
1 引言
實時渲染大數據量的森林場景仍然是圖形學技術領域的一大挑戰,因為森林場景中需要渲染大量的樹木,如果每棵樹都完整的建模,那么每棵樹將包含大量的幾何數據。如果不對這些幾何數據進行任何簡化,即使是現代的高性能顯卡也不能做到森林場景的實時渲染。現在已有各種各樣的技術被開發出來面對這一難題。一種方法是為每棵樹自動生成多細節層次的LOD(level of detail)[1]模型,然后根據樹木距離視點的距離選擇不同細節層次的樹木模型。[2]提出了一中利用3D紋理來表現森林場景的技術,這種方法在遠距離觀察時能達到比較高的渲染刷新率,但是這種技術在近距離觀察時樹木將明顯失真。[3]使用點而不是三角面片來渲染樹木,這種方法可以用在近距離觀察森林時,如漫游,同樣也可以用于俯瞰森林時。
OGRE[4]圖形引擎的場景管理使用插件技術即場景管理器如BSP、Octree場景管理器可以分別掛載到引擎中來對不同場景最優化管理。由于現代GPU更適合渲染少量巨大的物體,而不是很多小的幾何片斷。比如當一百萬個三角面捆綁成一個簇里能達到每秒300幀的渲染速度,在結構組織改變的時候,把這些三角形分布在一千個簇中(平均每簇一千個三角面),就可能會降低到30幀每秒這樣的結果。所以在現代3D應用程序中可渲染三角面的數量已經不是衡量應用程序的唯一標準。基于這個原因,在森林場景的渲染時,僅僅減少三角面片數不是絕對的有效。在OGRE圖形引擎中包含了Static Geometry(靜態幾何體)這個類,通過將樹木模型加入靜態幾何體中達到減少簇的數目來提高渲染效率。本文通過對靜態幾何體內樹木模型結合八叉樹排序的方法實現森林場景的實時渲染。
2 算法描述
當距離視點較遠時,通過不斷渲染Billboard樹木能取得較好的視覺效果。但這種方法的瓶頸是需要對每棵樹單獨產生渲染調用,大量的渲染調用降低了渲染效率。
一種方法是將所有的樹都集中在一起組成一大的集合,這樣只需要一次渲染調用。但是這種方法的問題是我們不能進行裁剪和LOD選擇。靜態幾何體的一個缺點就算在你的視野里(視截體)中只看到了整個靜態幾何體的一小部分,甚至包括在你身后的整個數據都會傳到圖形硬件中渲染。假如你把場景中所有的植被都放到一個靜態物體中,即使你只看到一顆小草,那么整個森林都會被渲染。
比較好的方法是使用八叉樹將樹木按不同LOD層次分組組織:首先將八叉樹按照深度優先編號,然后將樹木模型按照八叉樹的編號加到一個靜態幾何體里(如圖1)。
對每個八叉樹節點,存儲了每個多邊形組的兩個頂點數據,分別是每個八叉樹節點空間內的幾何體的起始頂點和末尾頂點,這樣只需要很小的額外存儲空間。
現在可以只需要一次渲染調用就可以渲染任意一個八叉樹節點空間的幾何體,通過選擇不同的八叉樹的深度,選擇不同的分辨率的樹木集合。
渲染靜態billbord樹首先從根節點開始,算法如下描述:
darw_geometry(octant)
{
if(not_visible(octant))
return;
if(dis_to(octant.bound) for each child octant draw_geomery(child octant); return; if(partially_visible(octant) and octant_depth< max_cull_depth) for each child octant draw_geometry(child octant); return; draw_octant_geometry(); } 當視點距離很近時,八叉樹空間將不斷分割,而選擇合適的精度模型,因此有可能某些樹木將使用完全模型來渲染而不是Billbord。同時八叉樹空間的不可見區域同將被裁剪掉。 draw_octant_geometry 只需要一次渲染調用。max_cull_depth 定義了八叉樹的最大深度。當超過這一深度時,八叉樹將不能繼續分割來獲得不可視區域的裁剪。只有在一定深度范圍內,通過分割八叉樹空間來裁剪不可見區域才能獲得比較好的性能,因為分割同樣帶來了增加調用渲染的消耗,而且被裁區域可能并不比一片樹葉大多少。 3 OGRE中的實現 OGRE的靜態類已經實現了對靜態幾何體的不同區域進行索引。每個八叉樹節點存儲了靜態幾何體區域的兩個頂點,分別代表八叉樹空間中幾何體的起始頂點和末尾頂點。 4 實驗結果 我們對本文的方法進行了測試。軟件環境:Windows XP, Visual Studio 2005 Professional Edition Ogre 1.4.7圖形引擎庫。硬件配置:Intel T5470, Geforce 8400M GS 128M。 場景包含大約60000棵樹,一個地形圖和一些小對象。這些樹木模型由3DMAX創建。每棵樹有3個LOD模型,最簡化模型為三塊交叉的Bllbord樹模型。當使用八叉樹結合靜態幾何體時刷新率為50~100幀每秒。如果僅僅使用Billbord時刷新率為45~50幀每秒。圖2顯示了運行結果。 5 結束語 本文主要對森林場景在OGRE中的實時渲染進行了分析研究。針對現代GPU的數據處理特點,通過八叉樹組織的靜態幾何體結構能有效的選擇樹木的幾何模型,最大化降低渲染調用的開銷,同時只需要很少的額外內存開。在保持比較好的視覺效果同時能保證較高的刷新率。 參考文獻: [1] Fuhrmann A, Umlauf E, Mantler S.Extreme Model Simplification for Forest Rendering[C].Eurographics Workshop on Natural Phenomena,2005:57-66. [2] Decaudin P, Neyret F.Rendering Forest Scenes in Real-Time[C].Rendering Techniques'04 (Eurographics Symposium on Rendering),2004:93-102. [3] Gilet G, Meyer A, Neyret F.Pointbased rendering of trees[C].Eurographics Workshop on Natural Phenomena,2005.http://www.evasion.imag.fr/Publications/2005/GMN05. [4] Object-Oriented Graphics Rendering Engine[EB\\OL].http://www.ogre3d.org/ [5] 高宇,鄧寶松,楊冰,等.基于外存的大規模虛擬環境交互漫游[J].系統仿真學報,2006,18(10):2988-2991. [6] 陳超,劉靜華,馬金盛.場景分割算法及其在實時漫游系統中的應用[J].計算機工程,2001,27(8):86-88. [7] 彭群生,鮑虎軍,金小剛.計算機真實感圖的算法基礎[M].北京:北京科學出版社,1999.