青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 505  文章 - 1034  trackbacks - 0
<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910


子曾經曰過:編程無他,唯手熟爾!

常用鏈接

留言簿(94)

隨筆分類(649)

隨筆檔案(505)

相冊

BCB

Crytek

  • crymod
  • Crytek's Offical Modding Portal

Game Industry

OGRE

other

Programmers

Qt

WOW Stuff

搜索

  •  

積分與排名

  • 積分 - 918861
  • 排名 - 14

最新隨筆

最新評論

閱讀排行榜

評論排行榜

【1. 概覽】
Ogre支持Quake3的bsp格式。相關的代碼在“Plugin_BSPSceneManager”工程中。主要的類有以下幾個:



Class BspSceneNode:

BspSceneNode是SceneNode的派生類,是專門提供給BSPSceneManager使用的。主要是提供針對于BSP tree的可見性判斷。這個類并不是BSP tree的node,BSP tree中的node使用BspNode。BspSceneNode會放入BSP tree的leaf節點中。由于SceneNode使用包裹盒的方法,不可分割,所以一個BspSceneNode可能放入多個Bsp tree的leaf節點中。

從類的定義看,BspSceneNode并沒有額外的保存什么數據。重寫的幾個虛函數主要是用來通知BspSceneMapager, BspSceneNode::_update()會調用BspSceneManager::_notifyObjectMoved(),detach objcect會調用BspSceneManager::_notifyObjectDetached()。



Class BspSceneManager:

粗略的看BspSceneManager與OctreeSceneManager類似。首先保存了一個BspLevel的指針,然后使用一個 walkTree()函數,用來遍歷tree結構。由于Quake使用BSP leaf tree,所以多了一個processVisibleLeaf()函數。另外一個明顯的不同是有一個renderStaticGeometry()函數, “Renders the static level geometry tagged in walkTree”。此函數渲染“mMatFaceGroupMap”中的所有數據。BSP一個好處是不透明面可以front-back的順序來渲染,而透明面back-front來渲染,OGRE是如何將此特性保存到MaterialFaceGroupMap的呢?



Class BspLevel:

這是一個核心的class。他存儲了BSP的所有數據,關鍵的數據有:

<!--[if !supportLists]-->1. <!--[endif]-->“BspNode* mRootNode;”――BSP tree的根節點

<!--[if !supportLists]-->2. <!--[endif]-->“VertexData* mVertexData;”――整個level的所有頂點;

<!--[if !supportLists]-->3. <!--[endif]-->“StaticFaceGroup* mFaceGroups;”――faces

<!--[if !supportLists]-->4. <!--[endif]-->“BspNode::Brush *mBrushes;”――用來做碰撞檢測的Brush,是QuakeBSP除了渲染以外的另外一個精華!Brush的名字有點怪,其實就是一個convex volume,可以減少CD的運算量。

<!--[if !supportLists]-->5. <!--[endif]-->“VisData mVisData;”――PVS數據,是又一個Quake中的精華!當初Carmark在設計Quake的時候還使用軟件渲染,hiden surface removal和減少over draw是最另他頭痛的問題。BSP的思想應該是他從網上看來的,不過PVS應該是他所創。PVS大大減少了over draw。(見《Michael Abrash's Graphics Programming Black Book》)

<!--[if !supportLists]-->6. <!--[endif]-->“PatchMap mPatches;”――Quake3支持貝賽爾曲面

關鍵的函數:

<!--[if !supportLists]-->1. <!--[endif]-->bool isLeafVisible(const BspNode* from, const BspNode* to) const;使用PVS來檢測可見性。

<!--[if !supportLists]-->2. <!--[endif]-->void _notifyObjectMoved(const MovableObject* mov, const Vector3& pos);
void _notifyObjectDetached(const MovableObject* mov);
à void tagNodesWithMovable(BspNode* node, const MovableObject* mov, const Vector3& pos);
把MovableObject(注意:不是SceneNode)掛到BSP的leaves上。



Class BspNode:

這是Bsp中的另外一個重要的類了。Node和Leaf都使用這個類。

重要數據:

<!--[if !supportLists]-->1. <!--[endif]-->Plane mSplitPlane; BspNode* mFront; BspNode* mBack;
分割平面和前后節點;

<!--[if !supportLists]-->2. <!--[endif]-->int mVisCluster;
每個cluster占pvs的一個bit,這是為了減少pvs占用的內存。

<!--[if !supportLists]-->3. <!--[endif]-->int mNumFaceGroups; int mFaceGroupStart;
用來找到BspLevel中哪些face group是屬于我這個leaf的,這樣做也是為了優化存儲;

<!--[if !supportLists]-->4. <!--[endif]-->IntersectingObjectSet mMovables;
和本節點相交的movable對象

<!--[if !supportLists]-->5. <!--[endif]-->NodeBrushList mSolidBrushes;
本節點包含的brush。

另外剩下的OgreQuake3Level.h、OgreQuake3Shader.h、OgreQuake3ShaderManager.h、 OgreQuake3Type.h主要是為了把Quake3格式的bsp,shader信息讀入,并轉換成Ogre本地的bsp定義以及 Material。現在quake3的源碼已經公開(非常感謝id software以及carmark),可以結合quake3的源碼來看。



【2. Quake3 bsp的加載】
以Demo_BSP為例,首先需要修改“quake3settings.cfg”,兩個參數,“Pak0Location”是pk包的路徑(是一個zip文件),“Map”為想要加載的地圖。

OGRE使用BspLevel來存儲Bsp場景信息,這個類是與文件格式無關的。所以需要另外一個類來把Quake3的bsp文件讀入。

Quake3Level的讀盤的主要由兩個函數完成:

1、“void Quake3Level::loadHeaderFromStream()”。調用的流程是:

BspApplication::loadResources()

à ResourceGroupManager::loadResourceGroup()【A】

à BspSceneManager::estimateWorldGeometry()

à BspLevel::calculateLoadingStages()

àQuake3Level::loadHeaderFromStream()

Quake3 BSP的文件格式很簡單明了,前面是一個文件頭,后面是幾個數據塊。文件頭主要存儲了幾個lump,包含數據塊的起始位置和大小,通過lump,可以直接seek到對于的數據塊。
此函數在加載了文件頭之后,調用了Quake3Level:: initialiseCounts ()函數,主要是計算了每個lump包含的對象的個數,例如face,vertex,bursh等等。

2、第二個函數“void Quake3Level::loadFromStream()”。調用的過程是:

ResourceGroupManager::loadResourceGroup()【A】

àBspSceneManager::setWorldGeometry()

àBspResourceManager::load()

àResourceManager::load()

àResource::load()

àBspLevel::loadImpl()

àQuake3Level::loadFromStream()

在這地方OGRE延續了他羅嗦的風格,BspSceneManager要通過BspResourceManager來加載場景,BspLevel實現為一種 Resource,BspResourceManager通過標準的ResourceManager――》Resource來找到BspLevel,然后調用其加載函數。



此函數首先構造了一個“MemoryDataStream”對象,在 MemoryDataStream的構造函數中把文件數據全部讀入其緩沖中(Quake也是這樣干的),然后調用“void Quake3Level::initialisePointers(void)”函數,得到所有lump索引的對象的指針。



Quake3Level 把文件讀入并明確了所有數據的指針之后,在void BspLevel::loadImpl()中調用“BspLevel::loadQuake3Level()”函數講Quake3level中的數據拷貝到自己的數據對象中。主要執行了以下幾個操作:

<!--[if !supportLists]-->1. <!--[endif]-->“BspLevel::loadEntities()”,這個lump存的是一個字符串,用來描述一些游戲信息,Ogre的這個函數只讀取了Player start信息(位置和角度)。

<!--[if !supportLists]-->2. <!--[endif]-->“Quake3Level:: extractLightmaps()”。Quake3 BSP的每個light map都是128×128大,此函數將Light map lump中的數據逐個調用“TextureManager::loadImage()”創建成Texture對象(class D3D9Texture for D3D9 RenderSystem)。

<!--[if !supportLists]-->3. <!--[endif]-->創建VertexData:
[Create vertex declaration] OGRE BspLevel使用的頂點格式為:Position3,Normal3,Diffuse,uv0,uv1;
[Build initial patches] 調用BspLevel::initQuake3Patches()。此函數遍歷Quake3Level中的所有faces,對于每個face type為“BSP_FACETYPE_PATCH”的face,創建一個PatchSurface對象,并調用PatchSurface:: defineSurface()函數進行,然后保存到BspLevel:: mPatches數組中。此函數還計算了BspLevel:: mPatchVertexCount和BspLevel:: mPatchIndexCount;
[硬件頂點緩沖] 調用HardwareBufferManager創建HardwareVertexBuffer對象;使用“BspLevel:: quakeVertexToBspVertex()”函數把q3 bsp頂點格式轉換為Ogre BSPLevel的頂點格式。然后綁定到BspLevel::mVertexData;

<!--[if !supportLists]-->4. <!--[endif]-->創建Faces:創建BspLevel:: mLeafFaceGroups數組;創建BspLevel:: mFaceGroups數組,此數組的數據在后面一步中填充;創建indexbuffer,并將Quake3Level::mElements拷貝進來;

<!--[if !supportLists]-->5. <!--[endif]-->Create materials for shaders:對于Quake3Level::mFaces每一個bsp_face_t,找到它索引的Quake3Shader,并創建 Material,如果沒有找到Quake3Shader的話則使用shader name去查找貼圖文件;
在此循環中還進行了“Copy face data”的操作,填充BspLevel:: mFaceGroups中的數據;

<!--[if !supportLists]-->6. <!--[endif]-->Nodes:創建BspLevel:: mRootNode數組,并將數據拷貝進來。

<!--[if !supportLists]-->7. <!--[endif]-->Brushes:將數據拷貝到BspLevel:: mBrushes中;

<!--[if !supportLists]-->8. <!--[endif]-->Leaves:設置每個leaf節點的數據,主要包括包裹盒,mFaceGroupStart,mNumFaceGroups,mVisCluster,mSolidBrushes。參見BspNode類;

<!--[if !supportLists]-->9. <!--[endif]-->Vis data:將數據拷貝到BspLevel:: mVisData中。

Quake3 BSP的load流程基本上就是這些了。

【3. Bsp tree scene的渲染】
仍然以Demo_BSP為例來分析。渲染的核心操作流程從SceneManager::_renderScene()開始(參見“Ogre學習筆記(3):Mesh的渲染流程”),接下來還有SceneManager:: _updateSceneGraph(),SceneManager::prepareRenderQueue(),BspSceneManager沒有重寫這幾個函數。不過,有一點需要注意,SceneManager:: _updateSceneGraph()調用了BspSceneNode::_update()與OctreeSceneManager類似的,如果有必要的話,會調用BspSceneManager:: _notifyObjectMoved()--》BspLevel:: _notifyObjectMoved(),將SceneNode中的MovableObject attach到正確的leaf node中。
接下來是BspSceneManager:: findVisibleObjects(),這是一個從SceneManager重寫的函數。順理成章的,這個函數調用了 BspSceneManager::walkTree()。在這個函數中,首先找到了camera所在的leaf node(通過BspLevel::findleaf()函數);然后遍歷BspLevel中的每個leaf node,先使用PVS檢測可見性(通過BspLevel::isLeafVisible()函數),如果可見再使用camera――bounding box檢測,如果還是可見的,則對此leaf node調用BspSceneManager::processVisibleLeaf()函數。此函數主要執行兩個操作,一個是把World Geometry加入到渲染數據表中(mFaceGroupSet和mMatFaceGroupMap),另外一個是把與此leaf node相交的MoveableObject加到渲染隊列中(mMovablesForRendering)。一件比較有疑問的事情是,walkTree 是循環遍歷所有leaf node,而沒有按照BSP tree遞歸遍歷,這大大削弱了BSP的提前排序的優勢。

然后是BspSceneManager重寫了另外一個重要的函數_renderVisibleObjects()。此函數包含兩個操作,一個是 renderStaticGeometry(),另外一個是調用父類的SceneManager::_renderVisibleObjects()。前者循環遍歷mMatFaceGroupMap,然后調用RenderSystem::_rendr();后者已經在“Ogre學習筆記(3):Mesh的渲染流程”中詳細分析過了。



 
posted on 2007-07-18 02:44 七星重劍 閱讀(920) 評論(0)  編輯 收藏 引用 所屬分類: Game EngineOGRE
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲免费人成在线视频观看| 久久精品免费电影| 欧美日韩精品欧美日韩精品一| 久久九九热re6这里有精品| 亚洲午夜一级| 亚洲综合欧美| 亚洲线精品一区二区三区八戒| 一区二区三区欧美成人| 亚洲天堂偷拍| 午夜亚洲精品| 久久国产直播| 欧美精品videossex性护士| 欧美精品一区二区三区一线天视频 | 国模 一区 二区 三区| 国产美女精品一区二区三区| 韩国精品主播一区二区在线观看| 红桃视频一区| 日韩视频亚洲视频| 欧美一级午夜免费电影| 亚洲电影视频在线| 91久久精品日日躁夜夜躁国产| 日韩性生活视频| 午夜激情综合网| 蜜臀av性久久久久蜜臀aⅴ| 欧美视频在线观看视频极品| 国内一区二区在线视频观看| 日韩视频一区二区三区| 欧美一区91| 欧美成人国产va精品日本一级| 最新中文字幕亚洲| 欧美一区二区视频观看视频| 欧美国产大片| 国内自拍视频一区二区三区| 亚洲手机成人高清视频| 欧美chengren| 午夜伦欧美伦电影理论片| 欧美精品大片| 欧美日韩精品一区二区三区| 亚洲国内自拍| 日韩亚洲欧美在线观看| 久久精品国产77777蜜臀| 欧美日韩一二区| 亚洲国产精品一区| 久久麻豆一区二区| 午夜精品久久| 国产精品免费电影| 亚洲一区二区av电影| 欧美激情国产日韩| 久久精品国产综合精品| 国产欧美日韩综合一区在线播放| 一本久久综合亚洲鲁鲁| 欧美www在线| 午夜视频在线观看一区二区三区| 欧美午夜不卡视频| 亚洲网站在线观看| 亚洲精品久久久久| 欧美日韩一区二区三区在线 | 黄色亚洲在线| 香蕉久久一区二区不卡无毒影院 | 极品尤物久久久av免费看| 亚洲女人天堂av| 亚洲精品色图| 欧美激情一区二区三区在线视频| 亚洲国产精品传媒在线观看| 噜噜噜噜噜久久久久久91| 欧美一区二区三区免费观看视频| 国产精品视频yy9299一区| 亚洲综合色丁香婷婷六月图片| 91久久在线视频| 欧美电影电视剧在线观看| 亚洲国产精品欧美一二99| 男女激情视频一区| 久久一区激情| 亚洲欧洲日本专区| 亚洲精品一级| 国产精品久久久亚洲一区| 欧美一区综合| 久久精品国产清高在天天线| 欲色影视综合吧| 亚洲高清免费| 欧美日韩视频在线观看一区二区三区| 一区二区三区精品国产| 中日韩美女免费视频网站在线观看| 国产精品任我爽爆在线播放| 久久久www成人免费无遮挡大片 | 国内精品久久久久影院薰衣草| 久久香蕉国产线看观看av| 免费一区二区三区| 国产精品一区毛片| 你懂的国产精品| 欧美成人免费播放| 亚洲欧美成人| 久久久久综合| 亚洲社区在线观看| 久久国产免费看| 一区二区免费在线观看| 欧美一区二区在线观看| 亚洲精品资源美女情侣酒店| 日韩午夜视频在线观看| 精品动漫3d一区二区三区| 亚洲人人精品| 国产一区二区无遮挡| 日韩视频一区| 狠狠色综合日日| 99精品欧美| 亚洲国产精品福利| 亚洲欧洲99久久| 亚洲天堂av图片| 美女久久一区| 欧美一级片久久久久久久| 欧美黄色aa电影| 久久免费视频在线| 国产精品欧美日韩一区二区| 欧美激情1区2区3区| 国产精品一区二区三区观看| 亚洲欧洲综合| 亚洲国产欧美一区二区三区同亚洲 | 国产欧美日韩精品一区| 亚洲福利视频在线| 国内久久婷婷综合| 亚洲五月婷婷| 亚洲自拍偷拍视频| 欧美日韩国产综合网| 亚洲东热激情| 国产主播喷水一区二区| 亚洲欧美国产日韩天堂区| 亚洲综合国产| 欧美日韩亚洲一区二区三区| 亚洲欧洲精品一区二区三区不卡| 亚洲国产精品一区二区第一页 | 久久黄色级2电影| 欧美网站在线观看| 亚洲蜜桃精久久久久久久| 99riav1国产精品视频| 欧美bbbxxxxx| 亚洲风情亚aⅴ在线发布| 亚洲福利视频免费观看| 久久国产视频网站| 久久久综合网站| 国产综合久久久久久| 欧美一区二区性| 久久全国免费视频| 在线看视频不卡| 欧美高清影院| 一本色道久久综合狠狠躁篇怎么玩| 一区二区三区欧美亚洲| 欧美日韩性生活视频| 亚洲调教视频在线观看| 亚洲欧美中文另类| 伊人精品成人久久综合软件| 亚洲风情亚aⅴ在线发布| 亚洲黄色精品| 欧美黑人在线播放| 亚洲精品一区中文| 亚洲欧美精品suv| 国产欧美一区二区三区久久人妖| 亚洲欧美高清| 欧美国产三级| 亚洲午夜激情| 国产精品一区在线播放| 久久久久久综合网天天| 欧美激情精品久久久久久黑人 | 国产毛片精品视频| 久久五月婷婷丁香社区| 亚洲经典在线| 欧美一区二区大片| 在线精品国产欧美| 欧美日韩精品久久| 亚洲欧美久久久| 噜噜噜在线观看免费视频日韩 | 国产精品igao视频网网址不卡日韩| 亚洲婷婷综合久久一本伊一区| 久久全球大尺度高清视频| 亚洲激情第一页| 国产精品久久福利| 久久久之久亚州精品露出| 亚洲精品欧美激情| 久久午夜电影网| 亚洲一区二区久久| 亚洲黄色成人网| 国产精品一区二区欧美| 欧美激情第五页| 欧美在线视频一区二区| 亚洲人成在线影院| 久久亚洲综合色一区二区三区| 一本色道婷婷久久欧美| 精品91在线| 国产精品高潮久久| 欧美大秀在线观看| 久久五月婷婷丁香社区| 午夜精品视频在线| 一区二区国产在线观看| 亚洲高清激情| 欧美成人免费大片| 久久不射电影网| 亚洲午夜激情免费视频| 亚洲黄色片网站| 怡红院精品视频| 国产精品呻吟| 国产精品久久久久久久9999|