[室外地形专辑]技术概览

快放假了,过节的气氛越来越浓,今天也没心思写代码,就更新下blog吧。这次做一个“室外地形技术专辑”,会有几篇文章组成。

第一篇:室外地形技术概览。

1.高度图

1.高度图代表了地形网格上每个顶点的高度值。
2.地形实时生成,所以会有一张高度图。
3.高度图级别:一个字节0-255级别,两个字节0-65535级别。为了节省资源,不同场景采用不同的级别。
4.地形网格顶点的法线可以通过周边顶点采样计算,也可以采用斜坡算法(即采用相邻四个顶点的高度及算法的k值计算当前顶点法线。K值需要手工调整,以达到较好的明暗效果。)
5.大家注意到了,高度图只纪录Z值,这样的地形是不能调整xy值做出象山这样的地形。不过目前我也没看到可以支持调整xy值的网游或编辑器。

2. 地形瓷砖

单位编辑块。一个大的地形是由无数个瓷砖组成的。高度图及材质最终都是应用到地形瓷砖上。因为硬件的限制,单个提交的地形Patch顶点数不能超过65535。我们的设计是一个Patch=33*33个顶点,顶点距为1米,当然顶点距也可以是2米但地形就不细腻了。

3.地形材质

1.纹理混合
一般做法采用多张贴图+1张混合贴图,用混合贴图的rgba四个通道依次混合。这是目前网游比较通用的做法。魔兽是最多5张(4张地形纹理(a为高光通道)+1张混合纹理(使用rgb通道,a通道用于标示阴影)。
地形也可以支持高光,只要在纹理Alpha通道上加入高光信息再混合即可。只是对美术要求比较高。像魔兽世界里的藤条路、石头路等都是使用高光之后才逼真了许多。
建议不要使用NormalMap,因为地形会占大部分的显示区域,对PS的压力太大渲染效率会明显降低。
2.美术制作地形贴图时,必须是无缝的。
3.地形自阴影
4.地形静态物体阴影。
5.不仅仅是对应图形上的“材质”概念,还包含地形其他属性。如每层Surface对应的声音属性、自动出现的植被,角色在该地形上行走时是否留下脚印等。
通过上面地形材质需实现的效果可知,固定管线是满足不了需求的,需要自己编写多个相对于的PS/VS。
第1、3、4点找时间做专题介绍。

4. 地形LOD

简单的说LOD在需要的时候使用较多的多边形,而在不需要的时候使用较少的多边形。
ROAM:实时最优适配网格算法。
VDPM:基于观察点的渐进网格。
Geomipmap:将地形分成N块,然后每块都有几个不同的lod级别的顶点索引,渲染时根据距离进行lod选择。要注意避免产生裂缝。

我们目前实现的就是GeoMipMap+游戏编程精粹2《使用联锁分片简化地形》算法,这也是Fracry采用的算法。顶点索引预先计算好,运行时根据地形Patch离相交的距离调整LOD,但相邻Patch之间的LOD级别相差不会超过1。
地形Patch最好采用三角形带,不要用三角形列表。这样会有个明显的好处就是降低了索引缓冲所占用的内存,速度上也会有所提升。

5. 地表装饰物

这是个很大的话题,等有了更深入的了解实现再来探讨。

6. 参考资料:

1.Focus.On.3D.Terrain.Programming 这是做地形必看的一本书,基本上覆盖了室外地形相关技术。
2.游戏编程精粹2《使用联锁分片简化地形》
3.魔兽世界地形Shader。用MyWarCraftStudio打开WOW的misc.mpq包,shader \ pixel \ 目录下以"terrain"打头的bls文件就是地形渲染使用的shader,带有"_s"后缀的是带高光的渲染,否则就是不带高光的。
4.http://www.cognigraph.com/ROAM_homepage/
5.Farcry SandBox
6.战地1942编辑器

posted on 2008-02-05 10:13  winsonchen  阅读(1262)  评论(1编辑  收藏  举报

导航