本系列的上一篇講了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框架的其餘組件。
本篇專一於新實現的高質量地形。下一篇仍會將一個新的渲染效果,屏幕空間次表面散射。