地形渲染是三维场景的重点,地形渲染的质量和效率直接影响整个场景渲染的质量和效率。一般来说,为了渲染出更加真实的地形,则地形的单个网格要尽量小,这样才能保证地形各个部分更加的精细。但如果网格变小,则对系统的开销也就大了,从而会影响渲染的效率。因此地形算法的设计实际上就是围绕着渲染质量和渲染效率这两方面的取舍,针对不同的硬件平台和设计目的,以求达到最合适的选取。
地形渲染算法
目前,有两种主要的地形渲染算法:
1)直接渲染
直接渲染指不对网格进行任何的处理,直接进行渲染。这种方式只适用于小规模地形,使用起来对渲染效率影星基本不大。但是如果用于大规模地形,渲染效率相当不理想。直接渲染还有个弊端,经由计算机渲染出来的东西,无论距离视点远近如何,看上去都很犀利,都很精细,这显然跟现实情况不同,现实中近的物体清晰,远的物体模糊,直接渲染无法实现这种效果。
2)基于LOD的渲染
LOD算法是常用的一种算法,针对与视点间距离的不同,提供不同精细程度的模型与之对应。如今主流游戏都采用算法来处理地形。但算法的缺点是每当摄像机的位置更新后都要重绘一次网格,这样消耗很高。
地形渲染流程
地形生成首先将地图和纹理加载到内存中,然后依次根据亮度混合公式生成亮度混合纹理,节点评价公式计算各节点精度,最后通过平截头体只渲染视点范围内地形。地形生成完后,优先设置摄像机,以实现漫游效果。接着依次渲染雾,太阳,天空,河流,树木。之所以将天空放在较后的地方這染是因为根据统计,用户在虚拟世界中漫游的时候,对天空细节的关注度并不高,即使花较大精力优化天空渲染,实际对用户体验的提升并不明显。
地形生成算法
地形渲染的核心部分是Heightmaps的生成与渲染。Heightmaps里的高度值描述的是每个像素的灰度值。暗色描述表示低海拔,亮色表示高海拔。
主要的地形生成算法有Fault Formation和Midpoint Displacement两种。Fault Formation算法的优点是不会被地点尺寸所限制,而Mdipoint Displacement算法要求地形尺寸是2的N次方(尺寸也必须是相等的,所以可以产生1024*1024的高度图,但不能产生一个512*1024的高度图)
1)Fault Formation算法
如图,假设地形的尺寸是m*n,在上面随机取一条线,给直线一端的所有点一个高度h,当然可以取任意条直线,每次高度叠加,然后再用平滑滤波算法把整个高度图进行平滑处理,重复这个过程,这样一个地形高度图就生成了。
2)Midpoint Displacement算法
Midpoint Displacement算法和Fault Formation算法表现为不同的地形类型。Fault Formation算法生成的是小山,而Midpoint Displacement算法则其中在连绵的山。而且Midpoint Displacement算法有个优点,由于算法本身的特性,它可以保证地形边界的上下左右四个方向都是连续的,也就是说如果把生成的地形进行拼接,形成无限地形,Mdipoint Displacement算法是可以实现。
Midpoint Displacement算法有个缺点是必须要求地形是的次方的。
上图中任意一个顶点都是用该顶点周围的个点取平均值之后再加上一个随机高度所求得的。例如求G,因为左面没有顶点,算法要求,超出边界就要取模运算,所以G求得用AECE四个点。第一次迭代为,根据边界A,B,C,D的四个点求中点然后再求边界和。第一次迭代结束,然后分别对AFEG,FDHE,EHDI,GEIC,重复这个过程。
求G和F是为了下一迭代,也就是求AFEG的中点做准备。但是不求H和I,是因为H和G是相等的,F和I是相等的。前面说过,该算法有个限制是必须是2的n次方,算法要求,超出边界就要取模运算,原因就在这里。
如果上图是第一次迭代,也就是RectSize=Size,B其实是和A相等的,D和A,C和A也相等,也就保证了为什么这个地形的边界是可以连接的,也就是上面和下面,左面和右面是可以不经过任何处理就可以拼接,也就是说坐
标点有可能超出Size的,就要用模运算。
LOD渲染地形
概念
细节层次模型针对一个场景或者场景中的物体,提供具有不同细节层次的模型,在渲染中视不同情况使用。它的目的是通过
保留重要视觉特征来生成简化的模型,以此降低场景复杂度,实现场景实时绘
制。
生成方法
细节层次模型生成的基本方式通常是,首先从一个具有全部细节的模型幵始,然后通过对模型的一系列简化逐个生成相应低细
节层次的模型。目前,用于生产简化的模型的方法主要包括种:细分法、采样法、删减法。
1)细分法是首先是用一个及其简易的基本模型来表示初始模型,接着通过一定的规则对基本模型进行迭代运算,模型每迭代一次,模型的局部区域都会增加一部分的细节,最后,直到产生满足用户所需误差要求的细节层次模型。
2) 采样法基本步骤是:首先在初始模型表面随机选取一部分点,连接这些点来构建多边形来生成采样后模型。采样后模型要满足用户定义的误差要求。采样点的数目用户可以自己设置,但生成的多边形形状不在控制范围之内。该方法多用于表面光滑的模型。
3)删减法
通过删减、合并几何模型的基本单元来实现模型简化。几何模型基本单元一般有点、边、面三种。删减法一般分为三种类型:
顶点删除:删除网格中顶点,之后对删除该顶点后所形成的空洞再进行三角剖分。
边压缩: 压缩网格上的一条边,将其变为一个顶点。同时,与该被压缩边相邻的两个三角形变为两条边,即这两个三角形的面积变为零。
面片收缩:将网格上的一个三角形作为考量样本,将其收缩为一个顶点。同时,与该被收缩三角形相邻的三个三角形将重新进行绘制。
本文参考文献《三维场景的渲染技术研究与实现》