1,介紹:
         

 PagedGeometryOGRE引擎的一個插件,它對(無窮)大區域的海量網格的渲染提供優化策略。它非常適合于稠密的森林和室外場景,那里有海量的樹,草,巖石,灌木叢等場景對象。

 

2, PagedGeometry管理

PagedGeometry class

 

      該類負責加載那些需要立即(或很快)可見的場景幾何,而不加載其他的場景以節約內存空間。PagedGeometry引擎可以通過諸如靜態幾何,imposters等方法去顯示實體對象(Entities)。這些方法是與實體和場景相機的距離,以及你的配置相關的。

      對頁面的加載是通過用戶定義的PageLoader來完成的。這樣,用戶可以編程實現加載頁面,無論它是來自硬盤上的文件,程序產生的或是其他地方。

 

     GeometryPageManager

     PagedGeometry類中使用,用于管理分頁頁面,在需要的時候做cacheing, deleting等工作。它通過分析攝像機距離去計算頁面cathe的速度,并delete那些已經經過了設定時間的不可見頁面。

調用PagedGeometry::addDetailLevel(), 創建 GeometryPageManager

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

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

addDetailLevel()

Adds a detail level to the PagedGeometry object.

PageType 對該detail level,用戶想使用的頁面類型。它不是一個函數參數,而是一個模板參數。

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

transitionLength 期望的衰減轉變長度 - (可選)

示例:

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

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

名叫pagedTreesPagedGeometry 的對象會在0100單位攝像機距離的范圍內使用batched(分批幾何,靜態幾何),100500單位距離范圍內使用imposters

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

transitionLength 參數在默認情況下是沒有的,但是用戶可以自己添加,它的作用是使細節層次轉變更平滑。但是注意,使用參數可能會是渲染的效率下降10%-30%。

3,頁面類型

Class GeometryPage

如上所說,該類是一個虛基類,用戶可以擴展繼承該類去實現不同的替代被渲染實體的方式,如batchedimposters等。如果你需要其他的頁面類型,你可以自己實現一些。

以下是用戶必須在子類中實現的虛函數:

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() {}

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

1,當PagedGeometry首先create一個GeometryPage,馬上調用它的init(),該函數就好像構造函數一樣。

2,準備一個幾何頁面給待渲染實體,設置頁面區域。

3,添加實體對象到該頁面,并初始化位置,方向等。

4,添加實體到場景中的最后一步。在添加完所有實體對象后自動調用。

5,從頁面完全刪除實體對象。

6,使整個頁面變為可見。

7,設置頁面的消減屬性。

8,在幀循環中保證頁面幾何的更新。

class BatchPage

The BatchPage class把實體當作靜態幾何體來渲染。

 

靜態幾何體(StaticGeometry):在場景中有許多實體是從它們加入場景開始就不會移動的,如房屋,樹等,Ogre為這種情況提供了StaticGeometry,它允許你批渲染很多物體.這個通常要比手動在SceneNodes添加要快多了。

 

class ImposterPage

the ImpostorPage class.把實體當作impostors(一種布告版圖像,看起來像真實的實體)來渲染

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

 

 

class GrassPage

A custom page type designed specifically for use with GrassLoader.

GrassPage頁面類型是被設計來配合GrassLoader使用的

這種類型是沒有做過優化的,它只是對所給的entity進行克隆,然后綁定到一個新的場景節點之上。這意味著性能很差。

4BatchedGeometry-一種靜態幾何的版本

class BatchedGeometry

它是Ogre::StaticGeometry的一個輕量級版本。

staticGeometryogre提供給用戶的批渲染的類,它可以一次性渲染那些在場景中保持“靜態的”實體(entities),如,房屋,樹等。

它給用戶提供多一些的對batch材質等的控制。

class SubBatch: public Ogre::Renderable

subBatch繼承于Renderable,是BatchedGeometry的內部類,它的構造函數中傳入BatchedGeometry指針和submesh的指針,該類包含在BatchedGeometry中。

5Loading Entities

class PageLoader

虛基類。用戶可以擴展它去提供負責加載頁面(Page)的回調函數。

PagedGeometry預裝了幾種不同的Loader,繼承于PageLoader,跟很多實體管理器不同的是,PagedGeometry不允許用戶一次性向object添加所有的entities,由于它是用于大規模的游戲場景,所以它會對世界幾何進行分頁,然后調度,只加載需要繪制的頁面。

只要引擎需要確定世界幾何的那一塊區域需要被加載,就要調用PageLoader的成員loadPage()。在函數中的PageInfo結構體,提供了頁面的包圍體信息。在函數中,用戶通過

addEntity()來添加實體到該頁面中,還可以定義實體的尺度,位置,旋轉等屬性。

當用戶創建了自己的loader對象后,必須將其attatchPagedGeometry對象上去。如下:

pagedGeometry->setPageLoader(yourPageLoader);

 

PageInfo: 結構體。提供給PageLoader的有用的頁面信息。基本的信息是定義被加載的區域,還有一些該區域的其他信息。

結構體內包含了一個TBoundtypedef Ogre::TRect<Ogre::Real> TBounds),所有在該頁面內的實體都必須放置在這個矩形包圍體之中。

具體的loaders

1GrassLoader 繼承于PageLoader,用于和PagedGeometry一起產生真實的草地場景。所謂真實的草地模擬,使用GrassLoader成員函數addLayer()來添加草,使用updateAnimation()來驅動動畫。

     當用戶創建了Grassloader對象后,必須將其attatchPagedGeometry對象上去。如下:

pagedGeometry->setPageLoader(GrassLoader);

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

     同時提供了一個數據結構來完全控制Grass的屬性 class GrassLayer,它是通過addLayer()來添加的,該類提供了一系列的“set”方法,用于用戶配置草地的材質,密度,大小等屬性信息。

 

2TreeLoader2D繼承于PageLoader,用于和PagedGeometry一起輕易的實現在地形上放置樹木的功能。

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

 

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

     引擎為2D3Dloader提供了一些公用的工具類,如class TreeRef,以內聯函數的性質為loader提供了位置,旋轉,尺寸,方向等的“get”數學運算。而TreeIterator2DTreeIterator3D則為loader提供了樹指針的操作。