最近想研究下GPU對地形渲染的性能優化,google到了Gpu gems2的一篇文章: <Terrain Rendering Using GPU-Based Geometry Clipmaps>,鏈接:http://research.microsoft.com/en-us/um/people/hoppe/gpugcm.pdf,掃了一遍,看懂了大概,把要點記于此:
1. 以視點為中心渲染不同層級的矩形環狀網格,每進一層網格密度增加一倍,取n = 2k−1作為每層網格的size,這樣中心能恰好位于網格的分割線上,同時每層網格的中心都能偏離下一級網格的中心一個單位,方便后面較密網格層次的偏移計算,原話是:"it is necessary to allow a finer level to shift while its next-coarser level stays fixed, and therefore the finer level must sometimes be off-center with respect to the next-coarser level",關于這一點,我還沒太搞明白
2. 創建一系列不同密度下的高度圖,從最疏的高度圖開始,執行一個UpSample的過程,細分高度,渲染下一級的高度圖,這個過程發生在視點變化的時候,
3. 在VS中,根據指定的過渡區域大小確定一個alpha,對當前層級的高度和下一級密度的高度做一個插值,以使得不同密度下的網格能平滑過渡,這個過程要用到VTF(Vertex Texture Fetch ),需要shader Mode3.0的支持,同時可以把這個alpha傳到PS繼續進行不同層級的Normal map的混合計算
4. 矩形環可以分割為一個個小的block,這樣可以減少需要的頂點數據量,同時也方便進行視錐裁減.
5. 可以只創建一個矩形環所需要的VertexBuffer,不同大小的矩形環在vs中進行偏移,縮放運算,由于都是相對坐標,因此可以使用D3DDECLTYPE_SHORT2來存貯坐標數據,一個頂點只需要4bytes
6. 在進行高度的插值時需要采樣2個不同級別下的高度圖,而VTF是一個相對比較耗時的操作,因此可以把當前高度和下一級別高度和當前高度的差壓縮為一個浮點值編碼到當前級別的高度圖中去,整數部分存貯當前級別的高度值,小數部分存貯高度差,同樣可以把相鄰兩個不同級別的Normal map壓縮到一張四通道的Normal map中去,這個壓縮的過程發生在UpSample時
7.設置紋理查找方式為wraparound addressing, 在更新地形時,實際上只是更新高度圖和Normal map,我們可以把當前視點的位置映射到這些紋理,根據攝像機移動的范圍構造出兩個矩形區域進行更新,這一點可能不太容易明白
大概就這些,匆忙所記下的東西也許會有錯誤,如有TX發現請不吝指出
PS: 今天登錄BLOG后發現有不少留言,大多已經是很早前的了,本人不寫文章的時候很少登錄博客,cppblog好像也沒有方便的回復留言的功能,所以如 再有想與我交流的朋友請發郵件給我:zzxhang@gmail.com