詳細介紹Quake2BSP檔案格式和應用(轉)

post0發表於2007-08-12
詳細介紹Quake2BSP檔案格式和應用(轉)[@more@]

  簡介

  

  BSP檔案格式是QUAKE 2用於儲存地圖的一種檔案格式,說得具體點,就是用於渲染Q2世界的。儘管有其他的資訊包含在BSP檔案中,用於其他遊戲部分(如敵人AI,等等),在這篇文章中,我不將討論他們。如果你有這方面的知識,請告訴我,我的E-MAIL在下面。在這篇文章中難免有錯誤之處,請告訴我。

  為了更清楚的描述BSP檔案格式,在這篇文章中將試圖對Q2渲染引擎進行技術方面的描述。現在讓我們假想這個渲染器使用的是基本的3D圖形技術,包含BSP樹結構。

  我們在這篇文章中描述的是Q2的BSP檔案格式,這個檔案格式由Kingpin使用(他建立了Q2引擎)。對於Q1和Q3的檔案格式,雖然他們很相同,但還是有點不相容。不管怎樣,BSP的檔案結構和技術不是很難,這篇文章將對於那些對這些格式趕興趣的人。

  

  法律方面的問題

  

  協定

  

  在這篇文章中,我用C語言結構來描述這些問題。為了使描述簡單並規範意義,我用int32 and uint32來表示有符號和無符號32位整形數;同樣的符號將用於16位和32位整形數。下面為用於儲存BSP檔案格式的頂點和向量的結構:

  struct point3f

  {

  float x;

  float y;

  float z;

  };

  struct point3s

  {

  int16 x;

  int16 y;

  int16 z;

  };

  第二版中一些地方,如儲存記憶體,就不需要很高的精度。相比於12位的版本,他只需要6位。通常情況下,都是用整形,而非浮點。

  

  渲染

  

  在這一節中,我們將介紹資料結構中的一些術語,並描述一下在Q2中進行渲染的過程。

  Q2地圖中劃分成很多的凸區域,這些區域用BSP樹頁來表示。任何時候攝象機的位置隨這些凸區域的水平方向改變。那一些樹葉都相互的簇擁在一起,成一叢一叢的。這些叢如何構成是由建立BSP檔案的工具決定。對於每個叢,他們都是以列表形式潛在,直觀地儲存。我們把這稱為potentially visible set(PVS).

  要渲染Q2地圖,首先篇歷BSP樹,以決定攝象機的匯入。一旦知道攝象機匯入的葉,相應的叢也匯入了(記住一片葉包含一個叢)。對應於叢的PVS然後解壓出攝象機對應的那些PVS的列表。葉然後儲存根據視角平截面裁減的葉的範圍。

  

  BSP樹

  

  許多人在透過用Q2和相似的引擎時,沒有把BSP樹和相應的演算法聯絡起來。透過上面的敘述,我們知道可視的介面是由PVS決定。BSP樹用於分割地圖並快速地決定哪一塊應該顯示。結果,在Q2中沒有好的渲染演算法,而不得不用其他資料結構代替(如OCTREE OR K-D TREE)。BSP樹不管怎樣是非常簡單的,他也被用在Q2引擎中其他不用渲染的任務中。

  當討論BSP樹中儲存葉結點的BSP樹(leaf-based BSP trees)和儲存內部結點的BSP樹(node-based BSP trees)時。用在Q2中的BSP樹的變化實際上是兩方面的。這兩方面是渲染和衝突檢測。用於渲染時,他直接把儲存在葉結點中的面渲染出來,因為他們是以PVS形式儲存的。如果你沒有執行衝突檢測,儲存在內部結點中的面將完全被忽約。

  

  檔案頭

  

  就我所知,所有的BSP檔案是以位元組的形式儲存的,當用在大的終端平臺上時,隨著匯入而變換。這使的相同的地圖能夠被使用不同平臺的Q2使用者共同使用。如果你在大的終端中匯入BSP檔案-------如Macintosh ,UNIX---你將不得不仔細的變換位元組順序。

  BSP檔案格式是用目錄結構組織的,檔案中所有的資料包含“自由的浮動”(free floating)團。在檔案開始處,有一個目錄告訴團的開始的偏移和長度。這個目錄後的檔案開始的8個位元組是用於描述這些團的位置和長度。

  BSP檔案頭的格式描述如下:

  struct bsp_lump

  {

  uint32 offset;      //從檔案開始的資料的偏移(用位元組表示)

  uint32 length;     //資料的長度(用位元組表示)

  };

  struct bsp_header

  {

  uint32 magic;    //magic號(“IBSP”)

  uint32 version;   //BSP格式的版本(38)

  bsp_lump lump[19];  //團的目錄

  };

  BSP檔案開始的4個位元組是一個標記,用於標識檔案是否一個軟體BSP檔案。這些位元組被拼為“IBSP”。接下來是32位無符號整形數,用於指定版本號。正如上面說的一樣,本檔案的版本號為38。

  接下來的表顯示BSP檔案中包含的不同的團,並且這些團的索引排列在檔案頭中。這些團的目的是用於標識不知道的問題標記(這個名字來源於QBSP原始碼),不管怎樣,他們是不用建構簡單的Q2標準渲染器。

  

  索引名          描述

  0 Entities       MAP實體文字緩衝器

  1 Planes       平面佇列

  2 Vertices      頂點佇列

  3 Visibility       壓縮的PVS資料和所有的叢目錄

  4 Nodes       BSP樹的內部結點陣列

  5 Texture Information 表面材質運用佇列

  6 Faces        表面佇列

  7 Lightmaps     光圖

  8 Leaves       BSP樹的內部葉佇列

  9 Leaf Face Table 索引查詢表,用於參考葉中的表面佇列

  10 Leaf Brush Table    ?

  11 Edges      邊佇列

  12 Face Edge Table 索引查詢表,用於參考葉中的邊佇列

  13 Models     ?

  14 Brushes    ?

  15 Brush Sides  ?

  16 Pop       ?

  17 Areas      ?

  18 Area Portals      ?

  許多團是用結構佇列的形式儲存的,這些結構都是固定大小。例如,頂點團是一個POINT3F結構佇列。由於每個POINT3F是12位,頂點值被12個頂點團分開進行計算。相似的計算也被用於面,結點,材質資訊,表面,葉和邊團。

  在下一節,我們將討論團的結構和作用。

  

  頂點團

  

  頂點團是一列世界的所有的頂點。每個結點是3個float浮點值,相當於12個位元組。你能計算這些頂點值透過把這些頂點團的長度分為12來計算。(You can compute the numbers of vertices by dividing the length of the vertex lump by 12. ^_^不好意思,可能翻譯錯了)

  Q2用一個協調系統透過Z-軸調整為向上。記住,就是你用其他的系統進行調節,你可能需要改變束縛盒和麵方程式。

  

  邊團

  在表面的頂點要共享,而且邊也要共享。每一條邊是儲存在頂點佇列中。儲存量是兩個16位的整形數,因此,在邊佇列中的邊數是由邊團的值除以4。這裡要說的是可能有一條邊被有卷繞著的線的兩個面共享,因此對於一條邊,沒有特殊的方向。這一點將在表面團中討論。

  

  表面團

  

  bsp_face結構佇列中表麵糰的格式如下:

  

  struct bsp_face

  {

  uint16 plane;      //表面平行的面的索引

  uint16 plane_side;  //設定表面是否與面平行

  

  uint32 first_edge;  //第一條邊的索引(在表面邊佇列中)

  uint16 num_edges; //連續的邊的數量(在表面邊佇列中)

  

  uint16 texture_info;   //材質資訊結構的索引

  uint8  lightmap_syles[4]; //光圖的型別

  uint32 lightmap_offset;  //光圖在光圖團中的偏移

  };

  這個bsp_face結構的長度是20位元組,面的數量可以由表面團除以20得到

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-952186/,如需轉載,請註明出處,否則將追究法律責任。

相關文章