您的位置:首页 > 大数据 > 人工智能

Ogre中的Terrain的Lod细节

2012-02-28 22:35 411 查看

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

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  存储