3D地形程式設計 之GeoMipMap基礎(6)

2021-04-25 09:11:13 字數 2049 閱讀 3416

到這裡《focus on 3d terrain programming》第5章內容就結束了,閱讀完這個確實理解了不少。提供了一些不錯的思路。

但其中演示**渲染是採用的單個三角形,這樣效率很低了。我根據他的方法想改用頂點和索引緩衝,當然用dx9.

域時(看圖

5.21

)。在圖中,塊的近似區域的值用黑園點標記出來了。

圖5.21

低級別塊的許多頂點,近似高細節的塊的值。

你看到中多少黑點在低的塊中嗎?好,那有很多低細節塊近似的高度值。這些近似值接近真實值,但不是十分接近。因此,當

3級塊細分成

2級塊時(或者反之依然),就產生突變;這是因為這些近似值「代替」了真實值(或者真實值代替了近似值)。

geomorghing

修改這個問題是通過計算近似值離真實值多遠,並從近似值到真實值更改它超過一系列的

255步。(或者再次反之亦然……。好,從現在起,我會假設我們正細化塊。如果你正合併塊,只要顛倒所有計算。)為了計算每一步移動的單位,用這個公式:

圖5.22

計算geomorghing

值的公式。

在公式裡,「

to」是需要達到的真實值就是新點的值,「

from

」是從**變換來的近似值就是舊的點的值,「

numsteps

」是geomorghing

作用點的步數值,這是我建議的

255。這整個過程解釋起來看起象圖

5.23中。

圖5.23 geomorghing

的解釋。

好吧,這就是了。

geomorghing

是個簡單的概念,能用很多不同的方法實現它。(我不想限制你的創造力,這是因為我自己不會實現它)。讓它有趣的開始吧,但是確定你回來並讀了後面那節,這幫助減少你地形實現裡面的突變甚至更多。

應該稍微製造點突變雜訊?

這個答案是不,儘管現在不重要。在我們減少地形實現的突變時有點重要。現在,雖然大多數突變真的產生的是改變

lod級別時,能被

geomorghing

修復,另乙個問題是我們用平滑著色(由頂點)光照。儘管這可能聽起來不是個大的處理,它是的。用每個

lod開關,光照應用到塊上得到更多

/更少的細節,這不應該發生。幸運地是,修復這個問題不算重要,而且你能用些不同方法來做。

乙個修復這個問題的方法是把地形的光照圖和地形紋理圖結合在一起。這允許你在同乙個渲染過程內做光照和紋理對映。遺憾地是,這意味著你必須使光照圖和紋理圖一樣的解析度達到最理想的效果。因此,如果你想動態改變光照,你也必須動態改變紋理圖,這是很昂貴的代價。

另乙個修復問題的方法是用乙個單獨的光照圖紋理過程。這是把光照圖看作紋理,排出由頂點光照,而允許動態更新它且不必擔心紋理圖。不幸地是,這意味著你的使用者至少需要

3層多重紋理這方式才會高效。此外,如果你的使用者用

2層紋理,做

2個渲染過程也不是乙個真的好主意。多通道渲染對小模型沒什麼大不了,但是對一套龐大的多邊形資料,象乙個地形網格,它就了不起了。

解決辦法已經完整地展示給你。第

1個方式很好,如果不需要動態的斜坡光照或者光照對映,而第

2個方法很好,如果你知道你的使用者有支援

3層或者更多紋理的顯示卡。小心使用額外的紋理層。

總結

好了,這是乙個長章節,但是你完成它了。恭喜你!在這章裡面,你學習了所有一般

clod

地形,但你也學習到了

地形演算法。你學習了怎麼提公升

速度和怎麼減少因為

lod改變產生的突變。在閱讀隨後

2個章節時保持所有這些技術在腦袋裡。鼓勵你自己:下乙個

clod

演算法是基於四叉樹結構。

參考文獻

3D地形程式設計 之GeoMipMap基礎(3)

圖5.10 為了防止與右邊圖塊斷裂,需要移除最右邊列的扇面的右邊頂點的圖塊。實現 僅是稍微弱地clod 你知道基礎背後的理論,但是現在我們需要實現它。這應該不會使你腦袋很頭痛。難的部分已經完結了,象往常一樣,我們將每一次談論一步。拿一些咖啡,鎖上你的門,放一些好的 開始吧!拼湊它因為 是一系列塊組成...

3D地形中的道路模擬

筆者注 這篇文章是我本人在2009年發表在cppblog的一篇技術文章 由於我的技術部落格遷移至,所以 到了此,非盜文。以下是正文 前段時間被專案組長委派實現基於3d地形的道路系統。實現的目標是類似於crysis編輯器的功能 可以由編輯人員在地面上指定一系列控制點,用某種合適的曲線插值生成一條道路,...

3D程式設計 Texture

include include include pragma comment lib,d3d9.lib pragma comment lib,d3dx9.lib pragma comment lib,winmm.lib define keydown vk code getasynckeystate ...