游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2403|回复: 5

求InterlockingTiles算法详解

[复制链接]

11

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
发表于 2007-7-25 19:14:00 | 显示全部楼层 |阅读模式
书上只略微的讲了下InterlockingTiles算法:
众所周知,现有的知名LOD算法包括CLOD、ROAM等,但是这些算法普遍具有比较变态的特点就是每帧都必须要改变顶点的数据。对于Direct3D而言,锁存解存是不可避免的,虽然可以使用Dynamic存储器来提升锁存解存的速度,但是Dynamic渲染速度就比较慢。一句话,这些算法都不适于现在这种硬件的体系结构,即瓶颈在AGP存储器的体系结构,或者更加明确的说,就是瓶颈在锁存和解存的体系结构。

InterlockingTiles算法给出了一个比较简单的实现,这个算法的本质是,一开头就将Vertex数据填好,然后就不再动了,变动的只是Index数据。比如,刚开始以9X9为一个Tile,那么一个Tile的Vertex数据就是81个,怎么都不变。然后,9X9就有4级LOD:把9X9全画出来是一个,9X9隔一个点画,就是画5X5,是一个,然后是2X2和1X1。这样就可以为每一个LOD编制Index表。而对于不同LOD的联系,由于刚上来都知道是什么,也可以为连接部分编制Index表。

这样一开始,所有的Vertex和Index都将在最开始就被建立起来,不需要运行时锁存解存,顶点运算。

Gems2中对本算法有更多介绍,后面附有一部分代码,均使用了9X9Tile,17X17和33X33Tile均没有实现,可参考阅读。

哪位大哥讲详细些?或给出资料?小弟感激涕零!

11

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
 楼主| 发表于 2007-7-25 19:22:00 | 显示全部楼层

Re:求InterlockingTiles算法详解


使用Gems II中提到的Interlocking Tiles实现LOD固然很快,但是它无法处理多层贴图,这是skull兄不久前在dreams兄的blog上的一段回复。
Interlocking Tiles的所有Tiles共享同一组index buffer,这是它节省内存的地方,也是它无法绘制多层贴图的主要原因。假设我们有一组贴图,分别为贴图1、贴图2…那么对于贴图1而言,并非所有的三角形中都含有它的成分,所以我们画了大量多余的三角形。
在生成interlocking tiles系统的多级index buffer时,我们仅仅考虑了相机与tile之间的距离这一个因素,现在,我们要把多层贴图这个因素考虑进去。
假设用ROAM
在初始化的时候,我们需要统计好每个非叶结点(这个时候把每个tile当成一棵最大的满二叉树,即分割到底)下所有子结点包含的顶点对于每层贴图的信息,这个用来决定是否继续分割。在渲染的时候,我们要用那三个参数(高度差,摄像机距离,贴图统计)来生成每层贴图的分割树,之后选择一棵(为了防止tile内部的裂缝,我们必须用同一棵树)来渲染,我们也可以对前一层贴图生成的树进行继续分割,这样可以保证最后得到的树对于每一层贴图都足够细致。
接下来我们画三角形,渲染的时候的循环是for each 贴图,我们只检查所有的叶结点,如果三角形的三个顶点当中包含该层贴图我们就画,否则不画。
渲染的时候我打算用单独一个流来保存alpha值,需要一提的是,渲染时候使用的alpha和我们习惯的混合度不一样,由于blend的顺序是依次进行,所以第一个贴图的权重最小,最后一个贴图的权重最大。
假设我们按照从上到下的顺序找出所有alpha不为0的贴图,比方说:
20%
20%
50%
10%(相加100%)
我们可以递推出渲染时候的alpha为:
1
0.5
5/9
0.1
注意:第一层定为100%,最后一层的值保持不变。

最后说一下,roam的确有点慢,可以的话还是要生成静态的index

11

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
 楼主| 发表于 2007-7-25 20:08:00 | 显示全部楼层

Re: 求InterlockingTiles算法详解

有没有人知道呀??????????? [em6] [em6]

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-7-25 22:08:00 | 显示全部楼层

Re: Re:求InterlockingTiles算法详解

敢问2007: Re:求InterlockingTiles算法详解


使用Gems II中提到的Interlocking Tiles实现LOD固然很快,但是它无法处理多层贴图,这是skull兄不久前在d...


who说的? 没做深入研究就下这样的结论未免也太误导新人了吧
wow用的就是Interlocking Tiles,人家是多少层贴图?
我用的也是Interlocking Tiles,而且是更进一步的随意大地形,无限制的Tile拼接,多线程动态加载Tile的地形,在shader里面,足够灵活的话多少层贴图也不是问题,只是考虑方便和效率,三到六层贴图就可以了。三通道二元差值都能实现6层贴图。
我最近搞了一些shader的东西,的确比固定管线强太多了。

11

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
 楼主| 发表于 2007-7-26 19:12:00 | 显示全部楼层

Re:求InterlockingTiles算法详解

强啊,能不能帮帮我?

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-7-26 23:52:00 | 显示全部楼层

Re:求InterlockingTiles算法详解

地形,我也差不多搞了三个月的时间的确是很头疼的东西,也不是三言两语能说的清楚的。
总之得一步步来
不要去看gam2上的代码,没太大的做用,也许会局限你的思维
建议先搞定block
最好先搞定动态生成 9x9 17x17 33x33 ..各种block和 对应的lod级别,
然后是这些block拼接成的一个个的tile,tile的单位可以是257x257,tile好比瓷砖
然后是tile拼接整个terrain,这样的好处是地形不会再是正方形的了,想拼什么形状就是什么形状,很灵活
实现动态加载也成为了可能,这部分说起来似乎很容易,实现起来却很痛苦
总之内容挺多的,自己要实践才能有收获。

过去我也发了不少关于这方面的贴子,LZ去搜索一把看看吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 17:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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