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

2021-04-25 09:07:53 字數 3626 閱讀 4412

圖5.10

為了防止與右邊圖塊斷裂,需要移除最右邊列的扇面的右邊頂點的圖塊。

實現

僅是稍微弱地clod

你知道基礎背後的理論,但是現在我們需要實現它。這應該不會使你腦袋很頭痛。難的部分已經完結了,象往常一樣,我們將每一次談論一步。拿一些咖啡,鎖上你的門,放一些好的**,開始吧!

拼湊它因為

是一系列塊組成的,實現從構造圖塊的資料結構開始,大概是乙個好主意。結構真的不需要包含很多資訊,我們需要包含的越少就越好。事實上,這始終是你在這本書看到的構造的最小的結構。別不太習慣它漂亮的大小!

所有的塊結構真正需要的是

2個變數。乙個變數將記錄當前塊的細節級別(

lod),而另乙個變數將儲存從塊中心到攝像機位置的距離。這就是給它的所有了!這是完整的塊的資料結構。它們的**在這裡:

struct sgeomm_patch

;它看起來象乙個極小的結構,但是記住:大東西得到了小包裝。如同這個包小一樣,我們將時常地使用它,所以確定你花了時間記熟它的成員。

是的,不再說那

2個成員資料結構的無用的東西。現在我們開始從

引擎最勞累的地方工作――

類。在開始,我們需要乙個指標保持我們的塊資訊,它會在我們的演示中在一些地方被動態的分配。接下來,我們需要算出塊的尺寸(用頂點),還有在地形中每一邊有多少塊。塊的大小會完整地給使用者,那麼我們能讓使用者在他初始化這個類時具體指定他喜歡的塊的大小。(我傾向於固定塊的大小為17×

17頂點,因為它提供漂亮的細節和速度的平衡。在這章的描述中假定這就是塊的大小。)

小心

的實現是基於乙個

畫素的正方形高度圖。這意味著你不能用中心點有位移的,不規則的高度圖生成器生成的高度圖。確保你所有高度圖是由這個有缺陷組成的生成器生成。

』(應該是指需要使用中心點正中的高度圖,至少是矩形的吧,不能是不規則的。)

的初始化

初始化系統中,我們需要的所有東西是使用者希望的塊的大小。(我將重聲我的建議是17×

17的頂點。)在我們得到它之後,我們就能初始化這個系統了。

首先,我們需要計算出地形的每條邊有多少塊。我們通過把高度圖大小按照單個塊大小劃分計算結果,如圖

5.11

所示。p

代表每條邊塊的數量,

h代表高度圖的大小,

s代表單獨一塊的大小。借助那個公式,看一下前面的圖

5.12

,看一會之後我們將把什麼變數帶進這個公式。

在我們計算出每條邊有多少塊之後,我們需要分配每條邊塊數量(我們剛完成了這個值的計算。)的平方大小的地形塊的緩衝區。

m_ppatches= new sgeomm_patch [square( m_inumpatchesperside )];

下一步,雖然這不是必要的初始化部分,我希望計算圖塊能完成的最大數的細節級別。注意這個最大數的細節級別是指最少細節的級別,最多細節級別是

0。隨著級別數的增大,細節減少。

圖5.11

計算地形網格每條邊塊的數量的公式。

這是計算方法:

idivisor= m_ipatchsize-1;

while( idivisor>2 )

我們在這裡所要做的就是看有多少個迴圈讓

idivisor

下降成2

。當idivisor到達2

,我們不能再下降任何更深一層了,由我們所控制我們已計算出細節級別。以17×

17塊的大小為例,我們最大數細節級別是

3,這意味著對於任何單一的塊我們有

4個不同細節級別(0、

1、2和

3)選擇。那些是為了初始化!現在我們繼續前進到極其大的停工部分。

的停工

這很簡單並且照慣例的停止

系統。我們所需要做的是釋放分配給圖塊緩衝區的記憶體和重置所有類的成員變數。

的維護

這個地形的工作與我們過去的

3章不同,連續層次細節(

clod

)地形演算法需要每幀都更新(這也是為什麼被叫做連續層次細節的原因)。大部分基本的連續層次細節(

clod

)演算法需要在更新時期間做大量的維護工作,但是

不是其中之一。我們在更新函式中所要做的工作是相當微小的;它簡單的由計算出我們的圖塊應該是什麼細節級別(

lod)構成。

在我們的

實現的update

函式中,我們需要更新每個塊;因此,我們需要用雙層

for迴圈:

for( z=0; z

{for( x=0; x

{在迴圈裡面我們要做的第一件事是計算從**者的位置(攝像機視點位置)到當前塊中心的距離。這個計算在你的高中數學課上看起來應該很熟悉,在那裡他們播種距離公式到你的腦袋裡。正好假使你象我一樣你也在那個所有課程上從頭到尾的睡過去了,它在這裡(看圖

5.12

):圖5.12 3d

的距離公式。

伴隨這個公式,看下圖

5.13

看我們將把什麼變數帶進公式。

圖5.13

與距離計算(從**者到當前圖塊中心)有關的變數。

一樣的距離計算的**:

m_ppatches[ipatch].m_fdistance= sqrtf(

square( ( fx-camera.m_veceyepos[0] ) )+

square( ( fy-camera.m_veceyepos[1] ) )+

square( ( fz-camera.m_veceyepos[2] ) ) );

在我們計算出從**者的距離,我們就能計算給塊多少細節級別。在**中,我計算這個級別用的硬編碼距離。(我在**片段的一些段落中是這麼做的;你也許想掠過一點前面的直接看我說的是什麼。)在你的引擎裡,雖然,你會想更精確的方法計算圖塊應該的細節級別。例如,在

***中,

willem de boer

展示了一種螢幕畫素測定演算法所以當塊改變它的細節級別時,太多的突變不會被呈現。

突變是當乙個多邊形物體改變到不同細節級別時出現的。這個變化也許明顯或者不明顯。例如,從級別

1變到級別

0不會導致許多突變因為乙個級別

1的塊仍然很細緻(對17×

17塊而言,至少是這樣)。然而,從級別

3變到級別

2會引起相當小部分的突變因為三角形從

8個變成了

32個。雖然是同樣的比例的三角形被新增到前者的塊中,級別

3到級別

2的變化更明顯。任何連續層次細節(

clod

)演算法的乙個重要目標是減少甚至是完全的消除突變。我們將在隨後談論更多。

無論如何,這本書裡我的

實現,我簡單的把細節級別(

lod)距離的變換硬編碼。(我想留下這個習題公開給你,讀者。是的,我知道我是個漂亮的傢伙。)這裡是細節級別變換的**片段:(所謂把細節度變換的距離固定下來及是硬編,這樣做好像是容易出現突變)

if( m_ppatches[ipatch].m_fdistance<500 )

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

到這裡 focus on 3d terrain programming 第5章內容就結束了,閱讀完這個確實理解了不少。提供了一些不錯的思路。但其中演示 渲染是採用的單個三角形,這樣效率很低了。我根據他的方法想改用頂點和索引緩衝,當然用dx9.域時 看圖 5.21 在圖中,塊的近似區域的值用黑園點標記...

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 ...