簡單快速的地形LOD連續變形

2021-04-13 01:14:16 字數 2218 閱讀 5786

在地形渲染中為了減輕渲染負擔其中乙個技術是就lod,但其帶了的乙個問題就是會產生地形「跳動」,因為地形的lod精度發生變化時鑲嵌的密度也發生了 變化。要解決這個問題有乙個方法就是當高精的模型向底精模型變化時不是突然變化過去的,而是慢慢漸變而來,這樣可以極大的減少「跳動」。通過設定適當的漸 變距離可以做到讓觀察者感覺不到地形的變化。

關於這個問題在一篇文章裡面也有介紹:terrain geomorphing in the vertex shader[1],但是原文介紹的方法過於複雜而且不適合用硬體加速,但是這仍然是一篇學習地形渲染的好文章。下面提出一種更加簡單,快速的方法來解決 這個問題。使用這個方法有乙個前提條件就是地形塊之間的lod級別相差不能大於1.

解決這個問題最基本的思想就是:對高精度的地形塊進行形變來模擬低精度的地形塊, 當高精地形和低精地形的形態完全一樣時,地形塊的lod才變為低精度的。設定高精度地形塊的高度為h1, 低精度的地形塊的高度為h2,最後根據漸變距離求出乙個插值t[0, 1],最後地形的高度就為h =  lerp(h1, h2, t)。

為了加速渲染頂點形變的過程由vs去計算。設定地形的最大lod級別為5,也就說有4種形變可能:0->1, 1->2, 2->3, 3->4.這樣我們可以把四種形變的高度值存到乙個float4(ymove)中。

對於如何求取低精度地形的高度值可以這樣計算:先求出頂點是屬於那乙個地形四方面,然後求出其在四方面上的uv座標,最後用二次線性插值來得到 四方面內任意一點的高度值。比如:乙個地形四方面這四個高度值分別為h00, h10, h01, h11.設u為四方面x方向的座標[0,1], v為四方面y方向的座標[0,1].那麼最後的高度值:

h(u, v) = (1.0f-v) * ((1.0f-u)*h00 + u*h10) + v * ( (1.0f-u)*h01 + u*h11 )

在計算好的形變的高度值後就可以在vs內計算形變高度值了,在計算之前還需要傳入兩個引數:

float4 morphstart, morphinvrange.其中morphmin表示形變的起始距離,比如(50, 100, 150, 200)

就表示地形在50處開始0->1形變,100處1->2形變, 150處2->3, 依此類推。morphinvrange是形變距離範圍的倒數,比如上例:moprhinvrange = (1/50, 1/50, 1/50, 1/50)。

在vs中計算高度值的**如下:

void v**ain(  in float3 pos   : position0,

in float4 ymove : position1 )

float viewdist = length(eye - pos );

float4 moprh   = saturate( (viewdist-morphstart)*morphinvrange );

pos.y         += dot( ymove, morph );

根據每個頂點對眼睛的距離來決定最後的形變值,可以保證只要頂點位置相同最後形變後的位置也一定相同,避開了文獻[1]中地形邊界接縫等等麻煩 的問題。注意在vs中計算morph為什麼要用saturate,是因為頂點緩衝中的pos.y是最高精度地形的高度值,比如要從1->2級,除了 要加上1->2的形變高度值外,還要加上0->1的高度差值, 而且2->3, 3->4的形變高度值應該為0.上面這個式子正好能滿足上面要求的情況。

處理完頂點形變後,還有乙個工作要做就是要根據眼睛與地形塊的最小距離來求地形塊的lod,設定眼睛與地形塊的最小距離為d,那麼求地形lod的**如下:

if ( d < morphstart.y )      // 0->1

lod = 0;

else if ( d < morphstart.z ) // 1->2

lod = 1;

else if ( d < morphstart.w ) // 2->3

lod = 2;

else if ( d < morphstart.w + 50 ) // 3->4 (50為最後一級形變的距離)

lod = 3;

else

lod = 4;

現在似乎可以做到消除地形「跳動」的現像了,但是有一點還需要注意那就是光照。上面做的工作只是消除了幾何形變產生的「跳動」,還有乙個產生 「跳動」感覺的是光照顏色,如果你是在vs內計算的頂點光照那麼還是會有「跳動」,因為頂點的密度變了光照的效果肯定不一樣。要解決這個問題就需要用光照 圖來代替頂點光照,但是這樣就限制了地形的光照是靜態的。如果你還是想要動態的地形光照,那就需要用地形的法向圖在ps內動態計算,注意:法向圖的邊界的 地方要特殊處理。

實時繪製基於LOD的地形相關技術

lod levels of etails細節層次 是解決大規模地形實時渲染的一項關鍵技術。在地形中實現lod技術後大大加速了地形的渲染。其基本思想是 對地形生成具有不同層次 不同解析度 的多個版本,在繪製地形時依據視點來選擇合適的層次細節進行繪製。本文用基於四叉樹構建的地形來實現相關lod演算法,有...

基於四叉樹的LOD地形場景的怪異優化探索

基於四叉樹的lod地形場景是開發3d大規模場景地形乙個避不開的話題。小弟對此一直耿耿於懷。雖然說號稱自已學了幾年遊戲程式設計。但實際上真的還不會做四叉樹的lod地形。但眼下要麼就乾掉他,要麼就被他乾掉。所以,解決這個問題,實屬無奈。大概的看了一些資料,西里糊塗的。不過明確兩點 1。通過視野遠近調整近...

基於四叉樹的LOD地形場景的怪異優化探索

基於四叉樹的lod地形場景是開發3d大規模場景地形乙個避不開的話題。小弟對此一直耿耿於懷。雖然說號稱自已學了幾年遊戲程式設計。但實際上真的還不會做四叉樹的lod地形。但眼下要麼就乾掉他,要麼就被他乾掉。所以,解決這個問題,實屬無奈。大概的看了一些資料,西里糊塗的。不過明確兩點 1。通過視野遠近調整近...