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编辑器