ROAM地形渲染算法的核心

1649 篇文章 11 订阅
1623 篇文章 22 订阅

ROAM地形渲染算法的核心是:

 

1.二叉三角面树的构造。

这个构造过程即细化分割三角面的过程(Tessellation)。具体的讲,我们将自己的地形分成若干个菱形(Diamond),每个Diamond由2个三角面构成,这些根三角面就是每棵二叉三角面树的根结点。在Tuner的文章中(点击),二叉三角面树的节点生成不是动态分配内存的,而是由一个固定数组池分配的,这样虽然使程序运行更高效,但树节点个数就是有限的了,在这种限制下,可以引入TessellationQueue队列,这个队列的作用是:对进入渲染列表的所有Diamond,根据其距离摄像机的远近排序,这样使得确保离摄像机近的Diamond优先进行Tessellation,等到数组池用完的时候也是离摄像机相对较远的Diamond了,这时停止分割。

 

对当前细节等级的三角面是否细分的判断公式如下(来自《实时地形引擎》):

E是误差限度,即Variance,我们需要单独为每棵二叉三角树构造一棵Variance Tree,这也是ROAM算法的核心之一。

S是进一步控制细分操作的比例值,在崎岖的地形我们可以采用大的S值,而在平坦的地形采用小的。

D是三角面距离摄像机的距离。

L是容忍限度。

这个公式的意思是,当ES/D大于L时进行细分,可见S和D起的作用,当距离摄像机越近,细分的可能性越大。这就是ROAM的LOD控制。

 

 

 

2.Variance Tree的构造。

我们要给细分的次数做一个限制,比如最大细节层次为Level 4,那么根据这个二叉三角树的最大深度,我们能确定Variance Tree的节点个数。

Variance Tree是存储在一个静态连续数组中的。

 

3.三角面细分规则。

这幅图表示了细分时的2种情况:要细分的三角面与相邻三角面构成菱形(常规情况),没构成菱形(特殊情况)。

后一种情况不特殊处理的话会导致裂缝现象。

第一种情况这两个三角面都细分就行了,第二种情况要先细分相邻三角面,直到与要细分的三角面构成菱形,再进行与情况一相同的处理。

 

 

对ROAM算法的实现《实时地形引擎》第七章Demo源代码可以参考。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值