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的作用。暂时忽略这个吧。