Ogre中的Terrain的Lod细节

来源:互联网 发布:淘宝情趣用品好卖吗 编辑:程序博客网 时间:2024/04/28 23:14

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

 

 

 


原创粉丝点击