1,介紹:
         

 PagedGeometryOGRE引擎的一個(gè)插件,它對(duì)(無(wú)窮)大區(qū)域的海量網(wǎng)格的渲染提供優(yōu)化策略。它非常適合于稠密的森林和室外場(chǎng)景,那里有海量的樹(shù),草,巖石,灌木叢等場(chǎng)景對(duì)象。

 

2, PagedGeometry管理

PagedGeometry class

 

      該類(lèi)負(fù)責(zé)加載那些需要立即(或很快)可見(jiàn)的場(chǎng)景幾何,而不加載其他的場(chǎng)景以節(jié)約內(nèi)存空間。PagedGeometry引擎可以通過(guò)諸如靜態(tài)幾何,imposters等方法去顯示實(shí)體對(duì)象(Entities)。這些方法是與實(shí)體和場(chǎng)景相機(jī)的距離,以及你的配置相關(guān)的。

      對(duì)頁(yè)面的加載是通過(guò)用戶定義的PageLoader來(lái)完成的。這樣,用戶可以編程實(shí)現(xiàn)加載頁(yè)面,無(wú)論它是來(lái)自硬盤(pán)上的文件,程序產(chǎn)生的或是其他地方。

 

     GeometryPageManager

     PagedGeometry類(lèi)中使用,用于管理分頁(yè)頁(yè)面,在需要的時(shí)候做cacheing, deleting等工作。它通過(guò)分析攝像機(jī)距離去計(jì)算頁(yè)面cathe的速度,并delete那些已經(jīng)經(jīng)過(guò)了設(shè)定時(shí)間的不可見(jiàn)頁(yè)面。

調(diào)用PagedGeometry::addDetailLevel(), 創(chuàng)建 GeometryPageManager

addDetailLevel() returns a pointer to this page manager, allowing you access to some useful functions, documented below.

類(lèi)成員函數(shù)中有些注釋了DO NOT USE的,不能被用戶使用,它們是在PagedGeometry中被使用的。

addDetailLevel()

Adds a detail level to the PagedGeometry object.

PageType 對(duì)該detail level,用戶想使用的頁(yè)面類(lèi)型。它不是一個(gè)函數(shù)參數(shù),而是一個(gè)模板參數(shù)。

 maxRange 這個(gè)detail level使用的最大距離(攝像機(jī)的視距)

transitionLength 期望的衰減轉(zhuǎn)變長(zhǎng)度 - (可選)

示例:

    pagedTrees->addDetailLevel<BatchPage>(100); //Use batched geometry from 0-100

    pagedTrees->addDetailLevel<ImpostorPage>(500); //Use impostors from 100-500

名叫pagedTreesPagedGeometry 的對(duì)象會(huì)在0100單位攝像機(jī)距離的范圍內(nèi)使用batched(分批幾何,靜態(tài)幾何),100500單位距離范圍內(nèi)使用imposters

如果已有的頁(yè)面類(lèi)型不合適,用戶可以很輕松的添加自定義的GeometryPage子類(lèi)

transitionLength 參數(shù)在默認(rèn)情況下是沒(méi)有的,但是用戶可以自己添加,它的作用是使細(xì)節(jié)層次轉(zhuǎn)變更平滑。但是注意,使用參數(shù)可能會(huì)是渲染的效率下降10%-30%。

3,頁(yè)面類(lèi)型

Class GeometryPage

如上所說(shuō),該類(lèi)是一個(gè)虛基類(lèi),用戶可以擴(kuò)展繼承該類(lèi)去實(shí)現(xiàn)不同的替代被渲染實(shí)體的方式,如batched,imposters等。如果你需要其他的頁(yè)面類(lèi)型,你可以自己實(shí)現(xiàn)一些。

以下是用戶必須在子類(lèi)中實(shí)現(xiàn)的虛函數(shù):

virtual void init(SceneManager *mgr, Camera *cam) = 0;

virtual void setRegion(Real left, Real top, Real right, Real bottom) = 0;

virtual void addEntity(Entity *ent, const Vector3 &position, const Quaternion &rotation, const Vector3 &scale, const Ogre::ColourValue &color) = 0;

virtual void build() {}

virtual void removeEntities() = 0;

virtual void setVisible(bool visible) = 0;

virtual void setFade(bool enabled, Real visibleDist, Real invisibleDist) = 0;

virtual void update() {}

以下是頁(yè)面管理器(page manager)如何去使用上面的函數(shù):

1,當(dāng)PagedGeometry首先create一個(gè)GeometryPage,馬上調(diào)用它的init(),該函數(shù)就好像構(gòu)造函數(shù)一樣。

2,準(zhǔn)備一個(gè)幾何頁(yè)面給待渲染實(shí)體,設(shè)置頁(yè)面區(qū)域。

3,添加實(shí)體對(duì)象到該頁(yè)面,并初始化位置,方向等。

4,添加實(shí)體到場(chǎng)景中的最后一步。在添加完所有實(shí)體對(duì)象后自動(dòng)調(diào)用。

5,從頁(yè)面完全刪除實(shí)體對(duì)象。

6,使整個(gè)頁(yè)面變?yōu)榭梢?jiàn)。

7,設(shè)置頁(yè)面的消減屬性。

8,在幀循環(huán)中保證頁(yè)面幾何的更新。

class BatchPage

The BatchPage class把實(shí)體當(dāng)作靜態(tài)幾何體來(lái)渲染。

 

靜態(tài)幾何體(StaticGeometry):在場(chǎng)景中有許多實(shí)體是從它們加入場(chǎng)景開(kāi)始就不會(huì)移動(dòng)的,如房屋,樹(shù)等,Ogre為這種情況提供了StaticGeometry類(lèi),它允許你批渲染很多物體.這個(gè)通常要比手動(dòng)在SceneNodes添加要快多了。

 

class ImposterPage

the ImpostorPage class.把實(shí)體當(dāng)作impostors(一種布告版圖像,看起來(lái)像真實(shí)的實(shí)體)來(lái)渲染

所有page類(lèi)型中,這個(gè)是最快的,它使用Impostors去代替要渲染的entities,這樣,顯卡只要去渲染一系列的2d image,而不是3d mesh

 

 

class GrassPage

A custom page type designed specifically for use with GrassLoader.

GrassPage頁(yè)面類(lèi)型是被設(shè)計(jì)來(lái)配合GrassLoader使用的

這種類(lèi)型是沒(méi)有做過(guò)優(yōu)化的,它只是對(duì)所給的entity進(jìn)行克隆,然后綁定到一個(gè)新的場(chǎng)景節(jié)點(diǎn)之上。這意味著性能很差。

4,BatchedGeometry-一種靜態(tài)幾何的版本

class BatchedGeometry

它是Ogre::StaticGeometry的一個(gè)輕量級(jí)版本。

staticGeometryogre提供給用戶的批渲染的類(lèi),它可以一次性渲染那些在場(chǎng)景中保持“靜態(tài)的”實(shí)體(entities),如,房屋,樹(shù)等。

它給用戶提供多一些的對(duì)batch材質(zhì)等的控制。

class SubBatch: public Ogre::Renderable

subBatch繼承于Renderable,是BatchedGeometry的內(nèi)部類(lèi),它的構(gòu)造函數(shù)中傳入BatchedGeometry指針和submesh的指針,該類(lèi)包含在BatchedGeometry中。

5,Loading Entities

class PageLoader

虛基類(lèi)。用戶可以擴(kuò)展它去提供負(fù)責(zé)加載頁(yè)面(Page)的回調(diào)函數(shù)。

PagedGeometry預(yù)裝了幾種不同的Loader,繼承于PageLoader,跟很多實(shí)體管理器不同的是,PagedGeometry不允許用戶一次性向object添加所有的entities,由于它是用于大規(guī)模的游戲場(chǎng)景,所以它會(huì)對(duì)世界幾何進(jìn)行分頁(yè),然后調(diào)度,只加載需要繪制的頁(yè)面。

只要引擎需要確定世界幾何的那一塊區(qū)域需要被加載,就要調(diào)用PageLoader的成員loadPage()。在函數(shù)中的PageInfo結(jié)構(gòu)體,提供了頁(yè)面的包圍體信息。在函數(shù)中,用戶通過(guò)

addEntity()來(lái)添加實(shí)體到該頁(yè)面中,還可以定義實(shí)體的尺度,位置,旋轉(zhuǎn)等屬性。

當(dāng)用戶創(chuàng)建了自己的loader對(duì)象后,必須將其attatchPagedGeometry對(duì)象上去。如下:

pagedGeometry->setPageLoader(yourPageLoader);

 

PageInfo: 結(jié)構(gòu)體。提供給PageLoader的有用的頁(yè)面信息?;镜男畔⑹嵌x被加載的區(qū)域,還有一些該區(qū)域的其他信息。

結(jié)構(gòu)體內(nèi)包含了一個(gè)TBoundtypedef Ogre::TRect<Ogre::Real> TBounds),所有在該頁(yè)面內(nèi)的實(shí)體都必須放置在這個(gè)矩形包圍體之中。

具體的loaders

1GrassLoader 繼承于PageLoader,用于和PagedGeometry一起產(chǎn)生真實(shí)的草地場(chǎng)景。所謂真實(shí)的草地模擬,使用GrassLoader成員函數(shù)addLayer()來(lái)添加草,使用updateAnimation()來(lái)驅(qū)動(dòng)動(dòng)畫(huà)。

     當(dāng)用戶創(chuàng)建了Grassloader對(duì)象后,必須將其attatchPagedGeometry對(duì)象上去。如下:

pagedGeometry->setPageLoader(GrassLoader);

     草地loader在使用幾何頁(yè)面類(lèi)型的時(shí)候,被推薦為使用GrassPage,這樣的渲染效率較高,而采用其他類(lèi)型則效率很低。

     同時(shí)提供了一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)完全控制Grass的屬性 class GrassLayer,它是通過(guò)addLayer()來(lái)添加的,該類(lèi)提供了一系列的“set”方法,用于用戶配置草地的材質(zhì),密度,大小等屬性信息。

 

2TreeLoader2D繼承于PageLoader,用于和PagedGeometry一起輕易的實(shí)現(xiàn)在地形上放置樹(shù)木的功能。

     使用方法和前述一致,使用時(shí),addTrees()方法向場(chǎng)景中添加樹(shù)木。需要注意的是,loader加載樹(shù)木時(shí)并不知道該地形的高度,而是假設(shè)高度為0,這就需要設(shè)定獲得當(dāng)前(即給定xz值時(shí))的地形高度。Loader提供了這些方法。

 

3TreeLoader3D2D的情況差不多,只是效率大概低40%左右。TreeLoader3D將樹(shù)在內(nèi)存中打包的效率很高,大約10Bytes一棵樹(shù),相當(dāng)于100萬(wàn)棵樹(shù)只要9.53m內(nèi)存空間。這就很適用于大規(guī)模森林的渲染。

     引擎為2D,3Dloader提供了一些公用的工具類(lèi),如class TreeRef,以?xún)?nèi)聯(lián)函數(shù)的性質(zhì)為loader提供了位置,旋轉(zhuǎn),尺寸,方向等的“get”數(shù)學(xué)運(yùn)算。而TreeIterator2D,TreeIterator3D則為loader提供了樹(shù)指針的操作。