游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4627|回复: 2

请问这种地形LOD的裂缝点怎么来消除?

[复制链接]

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2008-4-14 10:46:00 | 显示全部楼层 |阅读模式
麻烦各位帮分析一下,针对这种地形LOD设计方式,裂缝点怎么来消除?

本人的设计如下:该地形重构基于规则格网,首先将一个大范围的地形网格分割成小块(如1024×1024的网格分割成16×16个小块,每个小块的网格数为64×64),而后在每个小块中建立LOD层次级别(如最底层为原始分辨率64×64个网格点,往上一层为32×32个网格点,依此类推,共建立4层LOD级别)。在渲染时,根据视域范围只选择视域体在x-z平面上投影区域内的块来渲染,需要被渲染的块构成一个渲染区域。且根据一定的判别公式来选择每个块渲染的LOD级别。  
    现在关键的问题是块与块之间若选择了不同分辨率的LOD级别网格,所造成的裂缝怎么来消除。
    我是这样想的:规定相邻块的LOD层次差至多不超过1,且对每个块采用三角形扇的绘制方法。每个块存储与其相邻的上、下、左、右四个块的索引,每一帧的渲染分两个步骤:
    (1)遍历渲染区域内的块。
       对每一个块查看其上、下、左、右四个邻接块。若邻接块在之前还未遍历到,则跳过。
       否则,查看其LOD层次。若该邻接块的分辨率比当前块低,则在当前块中边界上会引起裂缝的点进行处理,不予以绘制,如附件图中的1,2点。
       若该邻接块的分辨率比当前块高,则通过索引将该邻接块边界上会引起裂缝的点进行处理,不予以绘制,如附件图中的3,4,5,6点。
    (2)对渲染区中的每一个块在前一阶段经过边界裂缝消除的基础上,以三角形扇的方式进行绘制。

我想问的是:
(1)这种在每一帧中进行两阶段的处理方式,是否能够保证地形漫游的流畅性?
(2)在进行块间不同LOD级别的裂缝消除时,将边界上会引起裂缝的点进行处理以在下一阶段不予以绘制应该怎么来实现?顶点应该怎么来排列才能达到这种实现方式?
麻烦帮出出主意!
sf_200841410465.png

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-4-14 20:04:00 | 显示全部楼层

Re:请问这种地形LOD的裂缝点怎么来消除?

根据观测你的四叉节点中心的距离来决定你的节点的block形态,另外block的各种lod索引组织方式要缓存起来,避免频繁的 lock,unlock  
我是这样规划的
比如:BLock_3_0_0_0_1 也就是LOD级别为3的block  left top right 不做补缝,bottom 补缝
1:代表该边做了补缝处理,0代表未处理,你需要做的就是把所有出现可能的block形态的顶点索引全部缓存起来,装入到stl Map里面,这些是可以用算法动态生成的,动态生成各种级别的block顶点索引(lod级别*2*2*2*2这样概率的补边各种组合形态的顶点索引)代码就要写一大堆(大概1千多行),不过很值,我只要传入5个参数,就可以得到这种形态的顶点索引结构,需要读什么形态就加载什么形态的顶点缓存,而且可以事先就放入到内存中,需要就读,我的地形里面就做到了漫游的时候无lock-unlock

另外你只要设定好阀值,网格间距一致,事实上就不会出现block节点之间的lod级别大于1的情况

之前我就已经实现了WOW的那种超大无缝地形,tile&block完全动态加载,人走到哪,就动态加载哪里的地形,可以参考我过去写过的文档的思路:

http://www.cppblog.com/tonykee/archive/2008/01/01/40161.html

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2008-4-18 08:32:00 | 显示全部楼层

Re:请问这种地形LOD的裂缝点怎么来消除?

谢谢两位的指点。真心感谢你们的帮助!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 19:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表