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
圖一.我理解的一種示例
圖一示例,當地圖的所需的各個參數定好後的大概地形四叉樹的結構。圖中所示,擁有頂點數據的樹的層爲第一層和第二層。可以得出第二層每個節點擁有的頂點個數,nSize = (mSize-1) / 2^(2-1), nBaseVer = nSize^2,且第二層所擁有的頂點信息被第三層和第四層共享,由於在OGRE中的地形使用skirt技術來避免Lod所帶來的縫隙,所以頂點個數需要額外加上skirt的因素。nSkirtVer = (2^nOwnTree + 1)*nSize,其中(nOwnTree爲共享頂點的層數 - 1,此處爲2),由此,則可以得出第二層中的每個節點所擁有的頂點個數爲nVertexNum =nBaseVer + nSkirtVer。
圖二.OGRE中的解釋示例
OGRE中,在頂點數據節點中,會創建兩種vertexbuffer
圖三.程序中創建兩個頂點緩衝
不是很瞭解這個deltabuff的作用。暫時忽略這個吧。