【3D數學基礎:圖形與游戲開發】筆記 第14章 三角網格
參考資料&原文鏈接
參考書籍:【3D數學基礎:圖形與游戲開發】 ISBN7-302-10946XTP.7262
(美) etcher Dun著、(美) an Arberry 清華大學出版社
網格
網格就是由很多個三角形或者多邊形構成的,在圖形學和建模中廣泛應用,用來模擬復雜物體的表面。三角形網格:
四邊形網格:
本章主要討論三角網格。當然,任意多邊形網格都能轉換成三角網格。我們討論的大多數概念對多邊形和三角網格都適用。三角網格以其簡單性而吸引人,相對於一般多邊形網格,許多操作對三角網格更容易。當然,多邊形在某些情況下具有優勢,在差別很顯著的時候我們會作出解釋。
表示網格
對於某些應用程序,這種表示方法已經足夠。然而,術語“網格”隱含的相鄰三角形的聯通性卻在種簡單表示中有任何體現。實際應用中出現的三角網格,每個二角形都和其他三角形共享邊。於是三角網格需要存儲三類信息:
- 頂點。每個三角形都有三個頂點。各頂點都有可能和其他三角形共享。
- 邊。連接兩個頂點的邊。每個三角形有三條邊。
- 面。每個三角形對應一個面。我們可以用頂點或邊列表表示面。
根據應用程序的不同,有多種有效的網格表示方法,本章集中討論一種標准存儲格式:索引三角網格。
索引三角網格
在索引三角網格中,我們維護了兩個列表:頂點表與三角形表。
每個頂點包含一個3D位置,也可能有如紋理映射坐標、表面法向量、光照值等附加數據。
通常,頂點列出的順序是非常重要的,因為我們必須考慮“正面”和“反面”。從前面看時,我們將用順時針方向列出項點。另外些信息也存在這一級中,如預先計算的表面法向量,表面屬性(紋理映射)等。
注意到,索引三角形列表中的鄰接信息是隱含的,例如:邊信息沒有直接存儲,但我們還是可以通過搜索三角形表找出公共邊。和前面“三角形數組”方式相比,這種方式確實能節省不少空間。原因是信息存於頂點級別,它的整數索引比之三角形數組里存儲的頂點重復率要小得多。實踐中,三角網里確實有大量的聯通性問題。
高級技術
簡單索引三角網格對於基本應用夠了。但為吏加高效地實現某些操作還可以進行一些改進。主要的問題是鄰接信息沒有顯式表達,所以必須從三角形列表中搜索。另一種表達方法可以在常數時間內取得這種信息。
方法是顯式維護一個邊列表,每邊出兩個端點定義,同吋維護一個共享該邊的三角形列表。這樣,三角形可視為三條邊而非三個點的列表,也就是說它是邊列表而不是點列表的索引。該思想的一個擴展稱作“ winged edge”模型,對每一頂點,存儲使用該點的邊的索引。這樣,三角形和邊都可以通過定位點列表快迷査找,請見參考資料[8]和[9]。
針對渲染的特殊表達
大多數圖形卡並不直接支持索引三角網。渲染三角形時,一般是將三個頂點同時提交。這樣,共享頂點會多次提交,三角形用到一次就提交一次。因為內存和圖形硬件間的數據傳輸是瓶頸,所以許多API硬件支持特殊的三角網格式以減少傳輸量。基本思想是排序點和面,使得顯存中已有的三角形不需要再次傳輸。
從最高靈活性到最低靈活性,我們討論三種方案:
- 頂點、索引緩存。它們存儲在顯卡的顯存中,顯存的速度極快,而普通的顯示技術都是內存保存,速度稍慢。
- 三角帶。
- 三角扇。
頂點緩存
說頂點緩存是一種特殊的存儲格式,不如說是API和硬件之間的一種存儲策略,用以發揮相續三角形頂點一致性的特點。通常,高級代碼不需要了解頂點緩存是如何實現和執行的;后面我們會給出一些驟以最大限度地利用頂點緩存。
和其他緩存機制類似,頂點緩存基於最近使用的數據未來仍將被使用的原則。圖形處理器緩存一小分(如,16個)最近使用的頂點,當AP要發送頂點時,首先探測級存內是否已存在。當然,這要求API了解圖形卡緩存的大小和替換機制。若緩存內沒有該頂點,則發生脫靶,API發送頂點,並更新緩存;若緩存內有該頂點,就命中,API通知圖形卡“使用緩存內位置x的頂點“。
如前所述,頂點緩存其實是種底層的優化手段。任何三角網都可用高級代碼實現止確渲染而不用考慮緩存。但進行頂點順序的調整,使共享頂點的三角形集中發送有助於提高效率。這種調整只需要進行一次,並且可以離線進行。它只會對性能有幫助,不會使沒有緩存的系統性能降低。參考附錄B中的參考資料[14]以獲得更多信息。
善用緩存,可能使發送到顯卡的頂點數降低到平均每三角形少於一個。
三角帶
角帶是一個三角形列表,其中每個三角形都與前一個三角形共享一邊。圖14.2顯示了一個三角帶的例子。注意頂點列出的順序使得每三個連續的點都能構成一個三角形,例如:
- 點1,2,3構成第一個三角形。
- 頂點2,3,4構成第二個三角形。
- 頂點3,4,5構成第三個三角形。
在圖14.2中,頂點以構成三角帶的順序編號。“索引”信息不再需要,因為項點順序己經隱式定義了三角形。通常,列表前部有頂點數目,或末尾處有一特殊碼表示“列表結束”。
注意到,頂點順序在順時針和逆時針間不斷變換(見圖14.3)。某些平台上,需要指出第一個三角形的頂點順序,而有些平台上順序是固定的。
- 點還是要多次發送給圖形卡,從另一方面說,每個三角形至少要發送一個項點。但在頂點緩存機制下,有可能將每個三角形發送的頂點數降到一個以下。當然,頂點緩存需要額外的簿記信息(索引和緩存管理數據)。可是盡管這些額外信息對單個項點來講相對較大,操作速度也會相對下降,但發送頂點數最少的系統在特定平台上速度最快。
- 我們希望最小化發往圖形卡的頂點數,所以三角帶的數目應盡可能少,即三角帶越長越好。
- 另一個希望減少三角帶數目的原因在於建立各三角帶需要額外時間。從另一方面說,分別渲染兩個長為n的三角帶所需時間長於渲染一個長為2n的三角帶,即使這個三角帶中的三角形數多於兩個分開帶中角形數量的和。於是,我們經常通過使用退化三角形連接多個三角帶,從而將整個網格置於一個連續的角帶中。退化的意思是面積為零。圖14.4顯示了如何重復頂點以將兩個三角帶合並為一個。
圖14.4的含義不太明顯,但這里有四個退化三角形用於連接兩個三角帶從而維持正確的順時針,逆時針順序。頂點7、8間的邊實際包含兩個退化三角形,圖14.5指出了圖14.4中包含的三角形。退化三角形面積為零不需渲染,所以不會影響效率,實際上要發送到圖形卡的頂點仍然只是第一列的頂點:
1,2,3,4,5,6,7,7,8,8,9,10,11,12,13
這符合我們每三個連續頂點表示一個三角形的約定。
一些硬件(如PS2上的GS可以跳過三角帶中的三角形,方法是通過一個頂點上的標志位指出“不必繪制”。此三角形這給我們一種方法可以有效的從任意點開始新三角帶而不必重復頂點或使用退化三角形。例如,圖14.4中的兩個三角帶可以如圖14.6那樣連接,其中灰色行表示頂點被標記“不必繪制”。
三角扇
三角扇和三角帶類似,但不如三角帶靈活,所以很少使用。如圖14.7所示即為三角扇:
三角網格類
法向量
- 在計算光照的時候需要法向量。
- 在3D模型背面進行剔除。
- 在模擬粒子在表面彈跳的效果。
- 加快正面檢測碰撞。
計算表面法向量
計算頂點法向量
一個頂點和很多三角形連接在一起的,計算方式是平均相鄰三角形的表面法向量。
三角網格操作
逐片操作
三角網格是頂點和三角形的列表。逐片操作有兩層含義:
- 一是對頂點的逐個進行操作,一個頂點一個頂點的操作。例如:要向三角網格應用轉換,如旋轉和縮放等。
- 二是逐三角形操作,一個三角形一個三角形的操作。例如:渲染三角網格。
焊接頂點
當兩個或更多頂點相同(也許有誤差)時,將它們焊接在一起是有益處的。更加准確地說,刪除其余的,只剩一個。
焊接頂點的目的有兩個。首先,去除重復頂點,節約內存。這是一種重要的優化方法,使得對網格的操作(如渲染和轉換更快。其次,使幾何上相鄰的邊在邏輯上也是相鄰的。
需要注意在焊接之前需要去除孤立點,不然造成網格變形:
面拆分
拆分即復制頂點,使邊不再被共用。它和焊接剛好相反。顯然,面拆分會導致拓撲間斷,因為面不再鄰接。而這正是我們的目的,使得幾何間斷的地方拓撲也足間斷的(如角和邊)。圖14.13顯示了兩個角形的拆分。盡管我們把兩個三角形分開以顯示這里有多個邊和頂點,這只是為了顯示。頂點沒有移動,新的頂點和邊其實是重合的。
邊縮坍和頂點拆分
邊縮坍是將邊縮減為項點的方法。與之對應的是頂點拆分。如圖1414所小。注意到邊縮坍使邊的兩個頂點變為一個,共享該邊的三角形(圖14.14中陰影部分)消失。邊縮坍常用於網格消減(14.45節討論)因為它減少了頂點和三角形數量。
網格消減
網格消減是將三角形和頂點數較多的網格變為三角形和頂點數相對較少的網格,並且要求網格外觀和要頂點盡可能保持不變。
本文標簽
游戲開發
、3D數學基礎:圖形與游戲開發
、Unreal Engine
、游戲開發基礎
、數學
、游戲開發數學基礎
、書籍筆記
、筆記
。