Ogre中的Terrain的Lod細節

 Ogre中的Terrain的Lod細節

在OGRE中,Terrain是地形組中的一個區塊。

Terrain的一些規則定義,

一個Terrain必須是個正方形的且邊的長度必須是

mSize=2^n+1

maxBatch =2^n+1且maxBatch <= 129

minBatch =2^n+1且minBatch<=maxBatch

名稱解釋:

       mSize就是地形矩形的邊的頂點數。

       maxBatch就是地形四叉樹節點中,最大的渲染區域的邊長。

       minBatch就是地形四叉樹節點中,最小的渲染區域的邊長。(注意,邊長不是指真的邊的長度,而是邊的頂點個數)

在地形中,有mSize,maxBatch,minBatch這三個值,就能夠計算出地形四叉樹的深度,地形的Lod等級。

LodLevels = log2(mSize-1)– log2(minBatch) + 1

      LodLevelsPerLeafNode = log2(maxBatch-1) –log2(minBatch) + 1

      TreeDepth = LodLevels –LodLevelsPerLeafNode + 1

並且:

      assert(TreeDepth == log2(mSize-1) –log2(manBatch) + 1)

在構建四叉樹時,每一層節點都擁有該節點對應的Lod信息,且葉子節點包含>=1個Lod信息。

爲了節省空間存儲頂點信息,不是每一層都擁有頂點數據。部分子節點共享父節點的頂點數據。在相應的四叉樹層創建頂點數據的規則爲:

      while (depth -- )

           split = 1 << depth;

           if split == (size-1)/128 then

                 size = (size-1) / 2

                 // 對應在depth+1創建頂點數據>depth的,且沒有頂點數據的層共享此depth對應的頂點數據

           end

      end

pic_1

圖一.我理解的一種示例

圖一示例,當地圖的所需的各個參數定好後的大概地形四叉樹的結構。圖中所示,擁有頂點數據的樹的層爲第一層和第二層。可以得出第二層每個節點擁有的頂點個數,nSize = (mSize-1) / 2^(2-1), nBaseVer = nSize^2,且第二層所擁有的頂點信息被第三層和第四層共享,由於在OGRE中的地形使用skirt技術來避免Lod所帶來的縫隙,所以頂點個數需要額外加上skirt的因素。nSkirtVer = (2^nOwnTree + 1)*nSize,其中(nOwnTree爲共享頂點的層數 - 1,此處爲2),由此,則可以得出第二層中的每個節點所擁有的頂點個數爲nVertexNum =nBaseVer + nSkirtVer。

pic_2

圖二.OGRE中的解釋示例

OGRE中,在頂點數據節點中,會創建兩種vertexbuffer

pic_3

圖三.程序中創建兩個頂點緩衝

不是很瞭解這個deltabuff的作用。暫時忽略這個吧。

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章