概要:
這是對網上一個LOD四叉樹例子的閱讀筆記
例子源碼:http://download.csdn.net/download/yyyyy_ddddd_0531/3903332
主要的地形渲染主要設計:
LOD 設計,通過以一個Bits 數組來標記Row*Col大小的地形,Row,Col取決於地形的大小,爲了節省內存空間,用一個位來代表一個網格,故Bits的大小爲 Col * ( Row/8+1,只有通過篩選條件判斷的頂點置入Bits的值爲1,即bits值爲1的值才進入渲染;
篩選條件:
1 渲染過程中啓動平截頭體篩選,只有在平截頭體內的網格頂點在才設爲TRUE,並進行下一輪細分
2 當具體距離大於2000時,他與高程坡度誤差和層級的乘積比大於某個比例常數時,它才進行細分(坡度越高,才越有機會細分
3 當距離小於2000,無視距離大小,只有坡度大於30時該頂點才需要細分
4 網格間的距離大於 MIN_GRID = 32,才需要細分
渲染過程:
1 通過三角扇來渲染三角面片,通過對應的網格中心頂點和網格間距,每次繪製4個三角面片
2 通過Bits 數組的值是否爲ture來確定渲染的LOD級別,達到數據的優化
渲染過程中的技巧
T形裂縫的修改
T形裂縫說到底就不同LOD層次時三角形中頂點的高度值差所造成的,不同LOD層次獲取某一個點的高度值取決於相鄰(相鄰距離取決於網格的大小)頂點的平均值,極端情況下是數據的最原始的精度,知道原因,就能夠解決問題,即如何保持不同LOD接口處頂點的高程值保持一致,傳統的做法是,高層次的LOD面片減少指向接口處頂點的線段即不繪製較高精度的頂點,稱爲邊刪除技術,或者增加LOD層次接口處的頂點線段即繪製高精度頂點稱爲邊插入技術,毋庸置疑,這兩種技術都有這樣的約束條件:
相鄰兩個LOD節點之間的層次不能大於2
例子採用邊插入的技術實現T裂縫的修補,用遞歸來消除LOD小於2的前提,主要要修復每個節點上,下, 左,右4個點多,如果子節點間也存在着LOD差,需遞歸遍歷
代碼:
//修補網格頂部裂縫的函數
//參數:
// nXCenter: 網格中心點坐的X值
// nZCenter: 網格中心點坐的Y值
// nSize:網格大小
void CTerrain::RemedyTop(int nXCenter,int nZCenter,int nSize)
{
if(nZCenter-2*nSize>=0)//保證尋址不越界
{
if(!m_cFlag.IsTrue(nXCenter,nZCenter-2*nSize))//此網格相鄰的頂部網格(同級的)沒有細分
return;
}
else
return;
//此網格相鄰的頂部網格(同級的)已經細分
//對頂部一分爲二遞歸(跨級精度的情況)
//左子節點上頂點遍歷
RemedyTop(nXCenter-nSize/2,nZCenter-nSize/2,nSize/2);
SetTextureCoord(nXCenter,nZCenter-nSize);
glVertex3i(nXCenter,Height(nXCenter,nZCenter-nSize),nZCenter-nSize);
//右子節點上頂點遍歷
RemedyTop(nXCenter+nSize/2,nZCenter-nSize/2,nSize/2);
}
其他類似
效果:
總結:
優點:
通過一個位來表示一個頂點,並存儲場景中所要渲染的數據,這種結果比較清晰,能夠很好的查看,調用場景中的數據。
採用LOD來優化數據加載,除了考慮距離來約束LOD層次外,也利用了坡度來約束覺得場景的細節層次LOD,很好的逼近現實
缺點: