lod(levels of etails細節層次)是解決大規模地形實時渲染的一項關鍵技術。在地形中實現lod技術後大大加速了地形的渲染。其基本思想是:對地形生成具有不同層次(不同解析度)的多個版本,在繪製地形時依據視點來選擇合適的層次細節進行繪製。本文用基於四叉樹構建的地形來實現相關lod演算法,有關四叉樹構建地形的技術可參考「引擎技術研究之地形技術」。
可把全部葉子節點儲存在陣列leaf,查詢鄰接節點時可遍歷leaf獲取,可根據以下條件判斷四個鄰接節點:
下[2]=當[0] && 下[3]=當[1]
右[0]=當[1] && 右[2]=當[3]
上[0]=當[2] && 上[1]=當[3]
左[3]=當[2] && 左[1]=當[0]
2根據視點選擇層次細節
先計算每個葉子節點與攝像機視點的距離distance,為每個節點設計一屬性unit作為解析度,依據distance設定unit值,如:
if (title->distance<50.0)
else if (title->distance<100)
else if (title->distance<200)
unit值適宜設定為2的n次冪(1 ,2 ,4 ,8,16 …….),如圖所示:
3構造節點的三角形
首先確定當前節點是葉子節點title,再根據葉子節點的ditance設定其unit值,每行的索引數(畫素)為mesh_width+1,節點裡每行或每列的網格數corner[1]-corner[0],用n[4]儲存每個塊的四個頂點索引值。
有兩種構造情況,一是有某一鄰接節點與當前節點的unit不等時,二是四個鄰接點的unit均與當前節點相同。
a
先處理第一種情況,若unit=1則乙個網格作為乙個塊構造兩三角形,unit=2,則2x2個網格作為乙個塊構造兩個三角形,以此類推。實現如下:
for(int j=0;junit) }
index為指向索引緩衝區記憶體的指標,m_numindex為索參數量,以上可完成塊的三角形構造。
b
現處理第二種情況。塊的三角形分兩部分構造,一是正常的,下圖黑色三角形。
二是交界處需特殊構造的三角形,如下圖紅色線條三角形:
)現畫正常的三角形,遍歷每個塊:
for(int j=0;junit)
}else
if ((title->neigbour[2]!=null&&title->neigbour[2]->unit>title->unit)
&& (j
=wide-title->unit&&(i/title->unit)%2==0)) //處理序號為雙的塊 }
else 處理下邊界
else 處理左邊界
else 處理右邊界
else 一般構造
}//結束正常構造
(2)構造節點交界處三角形
處理上邊界:
if (title->neigbour[2]!=null&&title->neigbour[2]->unit>title->unit)
}處理下邊界。。。
處理左邊界。。。
處理右邊界。。。
最終實現lod的地形構造效果圖
簡單快速的地形LOD連續變形
在地形渲染中為了減輕渲染負擔其中乙個技術是就lod,但其帶了的乙個問題就是會產生地形 跳動 因為地形的lod精度發生變化時鑲嵌的密度也發生了 變化。要解決這個問題有乙個方法就是當高精的模型向底精模型變化時不是突然變化過去的,而是慢慢漸變而來,這樣可以極大的減少 跳動 通過設定適當的漸 變距離可以做到...
基於功耗預算的實時繪製
今天給大家介紹的是一篇以畫面質量與裝置耗電量為引導的渲染技術 該 發表於2016年著名的siggraph圖形學大會。一般來說,影象渲染質量的提公升往往意味著每個畫素都要進行更多的資料計算,從而造成裝置耗電量的增加。對於對耗電量非常敏感的移動裝置來說,我們往往需要在畫面質量與裝置耗電量間進行權衡。如何...
基於四叉樹的LOD地形場景的怪異優化探索
基於四叉樹的lod地形場景是開發3d大規模場景地形乙個避不開的話題。小弟對此一直耿耿於懷。雖然說號稱自已學了幾年遊戲程式設計。但實際上真的還不會做四叉樹的lod地形。但眼下要麼就乾掉他,要麼就被他乾掉。所以,解決這個問題,實屬無奈。大概的看了一些資料,西里糊塗的。不過明確兩點 1。通過視野遠近調整近...