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í)版本。
staticGeometry是ogre提供給用戶的批渲染的類(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ì)象后,必須將其attatch到PagedGeometry對(duì)象上去。如下:
pagedGeometry->setPageLoader(yourPageLoader);
PageInfo: 結(jié)構(gòu)體。提供給PageLoader的有用的頁(yè)面信息?;镜男畔⑹嵌x被加載的區(qū)域,還有一些該區(qū)域的其他信息。
結(jié)構(gòu)體內(nèi)包含了一個(gè)TBound(typedef Ogre::TRect<Ogre::Real> TBounds),所有在該頁(yè)面內(nèi)的實(shí)體都必須放置在這個(gè)矩形包圍體之中。
具體的loaders:
(1)GrassLoader 繼承于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ì)象后,必須將其attatch到PagedGeometry對(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ì),密度,大小等屬性信息。
(2)TreeLoader2D繼承于PageLoader,用于和PagedGeometry一起輕易的實(shí)現(xiàn)在地形上放置樹(shù)木的功能。
使用方法和前述一致,使用時(shí),addTrees()方法向場(chǎng)景中添加樹(shù)木。需要注意的是,loader加載樹(shù)木時(shí)并不知道該地形的高度,而是假設(shè)高度為0,這就需要設(shè)定獲得當(dāng)前(即給定x,z值時(shí))的地形高度。Loader提供了這些方法。
(3)TreeLoader3D同2D的情況差不多,只是效率大概低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ù)指針的操作。