Class GeometryPage
如上所說,該類是一個虛基類,用戶可以擴展繼承該類去實現不同的替代被渲染實體的方式,如batched,imposters等。如果你需要其他的頁面類型,你可以自己實現一些。
以下是用戶必須在子類中實現的虛函數:
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進行克隆,然后綁定到一個新的場景節點之上。這意味著性能很差。
4,BatchedGeometry-一種靜態幾何的版本
class BatchedGeometry
它是Ogre::StaticGeometry的一個輕量級版本。
staticGeometry是ogre提供給用戶的批渲染的類,它可以一次性渲染那些在場景中保持“靜態的”實體(entities),如,房屋,樹等。
它給用戶提供多一些的對batch材質等的控制。
class SubBatch: public Ogre::Renderable
subBatch繼承于Renderable,是BatchedGeometry的內部類,它的構造函數中傳入BatchedGeometry指針和submesh的指針,該類包含在BatchedGeometry中。
5,Loading Entities
class PageLoader
虛基類。用戶可以擴展它去提供負責加載頁面(Page)的回調函數。
PagedGeometry預裝了幾種不同的Loader,繼承于PageLoader,跟很多實體管理器不同的是,PagedGeometry不允許用戶一次性向object添加所有的entities,由于它是用于大規模的游戲場景,所以它會對世界幾何進行分頁,然后調度,只加載需要繪制的頁面。
只要引擎需要確定世界幾何的那一塊區域需要被加載,就要調用PageLoader的成員loadPage()。在函數中的PageInfo結構體,提供了頁面的包圍體信息。在函數中,用戶通過
addEntity()來添加實體到該頁面中,還可以定義實體的尺度,位置,旋轉等屬性。
當用戶創建了自己的loader對象后,必須將其attatch到PagedGeometry對象上去。如下:
pagedGeometry->setPageLoader(yourPageLoader);
PageInfo: 結構體。提供給PageLoader的有用的頁面信息。基本的信息是定義被加載的區域,還有一些該區域的其他信息。
結構體內包含了一個TBound(typedef Ogre::TRect<Ogre::Real> TBounds),所有在該頁面內的實體都必須放置在這個矩形包圍體之中。
具體的loaders:
(1)GrassLoader 繼承于PageLoader,用于和PagedGeometry一起產生真實的草地場景。所謂真實的草地模擬,使用GrassLoader成員函數addLayer()來添加草,使用updateAnimation()來驅動動畫。
當用戶創建了Grassloader對象后,必須將其attatch到PagedGeometry對象上去。如下:
pagedGeometry->setPageLoader(GrassLoader);
草地loader在使用幾何頁面類型的時候,被推薦為使用GrassPage,這樣的渲染效率較高,而采用其他類型則效率很低。
同時提供了一個數據結構來完全控制Grass的屬性 class GrassLayer,它是通過addLayer()來添加的,該類提供了一系列的“set”方法,用于用戶配置草地的材質,密度,大小等屬性信息。
(2)TreeLoader2D繼承于PageLoader,用于和PagedGeometry一起輕易的實現在地形上放置樹木的功能。
使用方法和前述一致,使用時,addTrees()方法向場景中添加樹木。需要注意的是,loader加載樹木時并不知道該地形的高度,而是假設高度為0,這就需要設定獲得當前(即給定x,z值時)的地形高度。Loader提供了這些方法。
(3)TreeLoader3D同2D的情況差不多,只是效率大概低40%左右。TreeLoader3D將樹在內存中打包的效率很高,大約10Bytes一棵樹,相當于100萬棵樹只要9.53m內存空間。這就很適用于大規模森林的渲染。
引擎為2D,3Dloader提供了一些公用的工具類,如class TreeRef,以內聯函數的性質為loader提供了位置,旋轉,尺寸,方向等的“get”數學運算。而TreeIterator2D,TreeIterator3D則為loader提供了樹指針的操作。