本系列的上一篇讲了DR中的一些改进。本篇开始将描述这个版本加入的新功能,高质量地形。html
之前的地形实现和水面的方法同样,都是从Crytek在2008年的老方法改进而来。虽然比projected grid的好得多,而且速度很快,但有一些很明显的缺点:app
这个抖动的消除能够靠snapping操做,每次更新height map的时候都保证原来的像素中心仍然落在新的像素中心上。这样每一个顶点在视点移动后仍然会去到一样的值。框架
Clipmap也不是什么新东西了,最先出现于1998年。当时仍是用CPU作几何生成和提交。2004年MSR的一篇Geometry Clipmaps: Terrain Rendering Using Nested Regular Grids把clipmap带到了GPU时代,GPU Gems 2的第二章就是这篇paper的缩写版本。经过在GPU上维护一个以视点为中心逐级递减的一系列几何块,依靠GPU的强大处理能力,过分细分的地形也能实时渲染。用这种方法,远处的三角形密度仍然较大,因此能够很容易的把far plane推到5000-8000。spa
可是,即使是2004年的方法,也已通过去了将近10年。当时的SM3能VTF,却不能改变几何拓扑。在实际使用中,这个方法的开销仍是比较大的。并且因为不一样层次之间的三角形密度必定是2倍的关系,不免仍是会有看得见的层次跳变。orm
(这里的实现是从NVIDIA Direct3D SDK 11的一个例子改进而来)htm
DX11的GPU都支持tessellation,并且效率不低。这里对clipmap很天然的改进就是加入硬件tessellation支持,把细分的任务转到GPU里作。这样CPU端直须要提交比较稀疏的几何,在GPU里经过视点距离等因素计算tessellation level就能够了。并且,DX11要求GPU支持基于浮点的细分。三角形不但能够分整数次,还能够分任意的浮点数次。这么一来,就能让细分层次连续变化,层次跳变问题就完全解决了。blog
若是检测到GPU不支持tessellation,就会退回到原先的clipmap方法。这时候须要处理不一样层次之间的接缝问题。由于在链接处顶点密度不一样,若是不处理的话,就会出现许多小的空洞。这个问题由团队成员孙文全解决了,方法是调整较密层次的顶点,在shader里面手工插值,获得和较稀疏层次一样的height。这么作虽然没有在拓扑上达到无缝链接,但GPU的精度足以保证空洞基本都会小于一个pixel的大小。因此视觉上看不到空洞了。游戏
在Texturing and Modeling: A Procedural Approach这一巨做中,有详细介绍如何用分型的方式生成地形。这个方法也能够顺利地移植到GPU,在生成height map的时候使用。若是参数合适,生成的结果很像天然的风景,有崇山峻岭也有平原低地。height map以视点为中心,加上snapping的修正,获得视点周围必定面积的全部高度场。这个height map能够进一步用来计算gradient map,在渲染的时候做为normal使用。以视点为中心,全部方向都有几何也保证了能够轻松地使用原有的shadow map系统,包括CSM在内。ip
有了tessellation以后,height map里的信息只负责大致形状。顶点密度远大于height map的状况下,加上个noise就有意义了。normal上也能够用一样的方法加上像素级别的细节。有了这些以后,tessellation的能力就能所有显现出来了。而且能够根据GPU能力连续地调节细分的程度和细节的多少。get
在不支持tessellation的平台上,这个细节就只能加到normal上。视觉效果也不差。
综合一下,加入水体、light shaft、SSR等效果以后,能够发现新的地形系统能够很容易兼容于原有deferred框架的其余组件。
本篇专一于新实现的高质量地形。下一篇仍会将一个新的渲染效果,屏幕空间次表面散射。