大規模地形渲染

2022-09-15 17:27:10 字數 2109 閱讀 3211

地形在計算機圖形學中是一種比較特殊的物體

,通常地形被設計為規則的網格

,網格上每個頂點都根據不同的高度在網格的法線量方向進行位移

.地形的高度被儲存為乙個名為高度圖的檔案中

.當地形的網格結構越密集

,地形的外觀就顯得越平滑

.但同時也增加了需要被渲染的頂點和三角形數量

.怎麼才能在保證地形的外觀平滑的前提下儘量減少需要渲染的資料呢

,lod

就是基於這種想法應運而生的演算法.

第一章建立地形網格

圖1-1

如上圖,先將所有的虛線當做實線看待

.我們可以定義乙個

5x5的地形網格結構

.該結構有

25個頂點

,其中每個頂點的

x,y座標

[0,5]. z

座標也就是所謂的高度值被儲存在乙個

float[5x5]

的陣列中

(根據程式要求的精度

,可以是

unsigned short[5x5],int[5x5]….).

從上圖可以看出

,不論高度值如何變化

,地形網格在

xy投影平面的結構是固定的

,正是這個特點

,使得地形成為一種特殊的物體.

上面的地形網格圖是地形中

quadtree(4叉樹)

的基礎.

在後面,

我會講到基於

binarytree(2叉樹)

及更複雜的

diamond

等結構的地形網格

.不過現在不用管它

,讓我們從最簡單的

quadtree開始.

繼續看圖

1-1,

我們把整個網格結構的中間那個點標為點

0,它代表一共

block

結構.block

結構有4

個子節點

,乙個父節點

.乙個關於

block

跨度的數值

,還有乙個標示

block

的位置的座標值

(通常我們取

block

左下角的那個點座標

). struct block

如果我們假設圖

1-1中網格結構

x,y方向都代表

4個單位,那

block 0

的成員為:4個

child 1,2,3,4. 1

個parent

為null,iblockstride

為2(block

邊長的一半

).iblockx = 0,iblocky = 0;

現在它的4個

child block

的iblockstride

都為1.

也就是說這4個

child

都不能在細分下去了

.所以它們都是

quadtree

上的葉子節點.

即沒有子節點

,有且僅有乙個父節點.

現在我們來渲染整個網格

.對於每個葉子

block.

我們把它看成是個

********fan.

因此我們對每個

block

都可以用以下偽**

glbegin(gl_********_fan);

glvertex3f(center);

glvertex3f(lowerleft);

glvertex3f(lowercenter);

glvertex3f(lowerright);

glvertex3f(midright);

glvertex3f(upperright);

glvertex3f(uppercenter);

glvertex3f(upperleft);

glvertex3f(midleft);

glend();

注意上面的頂點遍歷順序是逆時針的.

夠簡單吧.^_^ 

Unity 大規模魚群的渲染

看了gdc關於abzu的演講,感覺很受啟發,決定在unity中實現其中講到的魚群的渲染。首先是乙個基礎的shader,這裡我寫了乙個支援主貼圖和法線貼圖的只有漫反射的shader 大概就是這樣 shader fishtest fishshader noscaleoffset normalmap no...

利用GPU實現大規模動畫角色的渲染

我想很多開發遊戲的小夥伴都希望自己的場景內能渲染越多物體越好,甚至是能同時渲染成千上萬個有自己動作的遊戲角色就更好了。但不幸的是,渲染和管理大量的遊戲物件是以犧牲cpu和gpu效能為代價的,因為有太多draw call的問題,如果遊戲物件有動畫的話還會涉及到cpu的蒙皮開銷,最後我們必須找到其他的解...

大規模機器學習

如果我們有乙個低方差的模型,增加資料集的規模可以幫助你獲得更好的結果。我們應 該怎樣應對乙個有 100 萬條記錄的訓練集?以線性回歸模型為例,每一次梯度下降迭代,我們都需要計算訓練集的誤差的平方和,如果我們的學習演算法需要有 20 次迭代,這便已經是非常大的計算代價。首先應該做的事是去檢查乙個這麼大...