【《Real-Time Rendering 3rd》 提煉總結】(十一) 第十四章 : 遊戲開發中的渲染加速算法總結


本文由@淺墨_毛星雲 出品,轉載請註明出處。  
文章鏈接: http://blog.csdn.net/poem_qianmo/article/details/78884513




導讀

 

這是一篇1萬3千餘字的文章,通過閱讀,你將對遊戲開發與實時渲染中加速渲染算法的以下要點有所瞭解:

  • 常用空間數據結構(Spatial Data Structures)
    • 層次包圍盒(BVH ,Bounding Volume Hierarchies)
    • BSP樹(BSP Trees)
    • 八叉樹(Octrees)
    • 場景圖(Scene Graphs)
  • 各種裁剪技術(Culling Techniques)
    • 背面裁剪(Backface Culling)
    • 視錐裁剪(View Frustum Culling)
    • 遮擋剔除(Occlusion Culling)
    • 層次視錐裁剪(Hierarchical View Frustum Culling)
    • 入口裁剪(Portal Culling)
    • 細節裁剪(Detail Culling)
  • 各種層次細節(LOD,Level of Detail)技術
    • 幾種LOD切換技術(Discrete Geometry LODs、Blend LODs、Alpha LODs、CLODs and Geomorph LODs)
    • 幾種LOD的選取技術(Range-Based、Projected Area-Based、Hysteresis)
  • 大型模型的渲染(Large Model Rendering)
  • 點渲染(Point Rendering)

 


引言


《Real-Time Rendering 3rd》書中提到,實時渲染領域有四大目標,激勵着遊戲開發者們不斷進步,它們是:

  • 更高的每秒幀數
  • 更高的分辨率
  • 渲染更多的物體與更具真實感的場景
  • 實現更高的複雜度

 

而要不斷地追逐這四大目標,需要持續不斷的優化算法,進行技術革新和硬件的升級。其中,加速渲染相關的算法一直是追逐這四大目標的重要一環。

這篇文章將基於《Real-Time Rendering 3rd》第十四章“Acceleration Algorithms”的內容,介紹計算機圖形學和遊戲開發中常用的對渲染進行加速的算法,尤其是對大量幾何體的渲染,而很多這類算法的核心都是基於空間數據結構(Spatial Data Structures)。所以,本文將先介紹一些遊戲開發中常用的空間數據結構,再進行各種加速算法,不同種類的裁剪算法,LOD相關的介紹。



一、空間數據結構 | Spatial Data Structures


空間數據結構(Spatial Data Structures)是將幾何體組織在N維空間中的一系列數據結構,而且我們可以很容易地將二維和三維的一些概念擴展到高維之中。這些空間數據結構可以用於很多實時渲染相關操作的加速查詢中,如場景管理,裁減算法、相交測試、光線追蹤、以及碰撞檢測等。

 

空間數據結構的組織通常是層次結構的。寬泛地說,即最頂層包含它之下的層次,後者又包含更下層的層次,以此類推。因此,這種結構具有嵌套和遞歸的特點。用層次結構的實現方式對訪問速度的提升很有幫助,複雜度可以從O(n)提升到O(log n)。但同時,使用了層次結構的大多數空間數據結構的構造開銷都比較大,雖然也可以在實時過程中進行漸進更新,但是通常需要作爲一個預處理的過程來完成。

 

一些常見的空間數據結構包括:

  • 層次包圍盒(Bounding Volume Hierachy,BVH)
  • 二元空間分割樹(Binary Space Partitioning,BSP),
  • 四叉樹
  • kd樹
  • 八叉樹(Octree)
  • 場景圖 (Scene Graphs)

其中,BSP樹和八叉樹都是基於空間細分(Space Subdivision)的數據結構,這說明它們是對整個場景空間進行細分並編碼到數據結構中的。例如,所有葉子節點的空間集合等同於整個場景空間,而且葉子節點不相互重疊。

BSP樹的大多數變種形式都是不規則的,而鬆散地意味着空間可以被任意細分。

八叉樹是規則的,意味着空間是以一種均勻的形式進行分割,雖然這種均勻性限制比較大,但這種均勻性常常是效率的源泉。另外值得注意的是,八叉樹是四叉樹的三維空間推廣。

另一方面,層次包圍盒不是空間細分結構,它僅將幾何物體周圍的空間包圍起來,所以包圍層次不需要包圍所有的空間。

 

下文將對其中的層次包圍盒、二元空間分割樹、八叉樹進行近一步介紹,並還將簡單提到場景圖(SceneGraph),這是一種比較高層次的,相較渲染性能更關注模型關係的數據結構。

當然,限於篇幅原因,這裏的每種數據結構都無法介紹得事無鉅細,但已在每種數據結構介紹的最後備好了一些延伸的閱讀材料,方便希望進一步瞭解的朋友們進行延伸閱讀。



1.1 層次包圍盒BVH | Bounding Volume Hierarchies


層次包圍盒(Bounding Volume Hierarchies, BVH)方法的核心思想是用體積略大而幾何特徵簡單的包圍盒來近似地描述複雜的幾何對象,從而只需對包圍盒重疊的對象進行進一步的相交測試。此外,通過構造樹狀層次結構,可以越來越逼近對象的幾何模型,直到幾乎完全獲得對象的幾何特徵。

 

對於三維場景的實時渲染來說,層次包圍體(Bounding Volume Hierarchy,BVH)是最常使用的一種空間數據結構。例如,層次包圍體經常用於層次視錐裁減。場景以層次樹結構進行組織,包含一個根節點(root)、一些內部節點(internal nodes),以及一些葉子節點(leaves)。頂部的節點是根,其無父節點。葉子節點(leaf node)包含需渲染的實際幾何體,且其沒有子節點。

相比之下,內部節點包含指向它子節點的指針。因此,只要根節點不是這顆樹唯一的一個節點,那麼它就是一個內部節點。樹中的每一個節點,包括葉子節點,都有一個包圍體可以將其子樹中的所有幾何體包圍起來,這就是包圍體層次的命名來源,同時,也說明了根節點有一個包含整個場景的包圍體。



圖1 左圖爲一個包含6個物體的簡單場景,每個物體由一個包圍的球體封閉起來,其中可以將包圍球體歸組爲一個更大的包圍球體,如此內推,直到所有的物體被最大的球體包圍,右圖所示爲層次包圍體(樹),可以用來表示左圖的物體層次、根節點的包圍體包含場景中的所有物體。

 

 

圖2 層次包圍盒的實現 @http://thomasdiewald.com/blog/?p=1488



圖3 層次包圍盒的實現 @http://thomasdiewald.com/blog/?p=1488

 

1.1.1 BVH的延伸閱讀材料


[1] https://hal.inria.fr/inria-00537446/file/bounding_volume_hierarchies.pdf

[2] https://www.codeproject.com/Articles/832957/Dynamic-Bounding-Volume-Hiearchy-in-Csharp

[3] Wald I, Boulos S, Shirley P. Raytracing deformable scenes using dynamic bounding volume hierarchies[J]. ACM Transactions on Graphics (TOG), 2007, 26(1): 6.

 

 

1.2  BSP樹 | BSP Trees


BSP樹(二叉空間分割樹,全稱Binary Space Partitioning Tree)是一種常用於判別對象可見性的空間數據結構。類似於畫家算法,BSP樹可以方便地將表面由後往前地在屏幕上渲染出來,特別適用於場景中對象固定不變,僅視點移動的情況。

其中,BSP是Binary Space Partitioning(二叉空間劃分法)的縮寫。這種方法遞歸地將空間使用超平面劃分爲凸面體集合。而這種子劃分引出了藉助於稱之爲BSP樹的樹形數據結構的場景表示。


圖4 一個BSP樹的構造

 

 

BSP 樹是一棵二叉樹,每個節點表示一個有向超平面,其將當前空間劃分爲前向(front)和背向(back)兩個子空間,分別對應當前節點的左子樹和右子樹。且BSP 樹已經在遊戲工業上應用了許多年(Doom是第一個使用BSP樹的商業遊戲)。儘管在現今BSP樹已經沒像過去那麼受歡迎了,但使用依然廣泛。

 BSP樹的一個有趣特性是,如果用一種特定的方式遍歷,樹的幾何內容可以從任何角度進行前後排序。這個排序可以近似軸對齊,精確對齊多邊形BSP。與BVH不同的是,BVH通常不包含任何形式的排序。

 

1.2.1 BSP樹的構造

 

• 從空樹開始,每次選擇一個面片作爲節點插入樹中

• 每次插入一個新節點,從樹的根節點開始遍歷

• 如果新節點面片與當前結點片面相交,將新面片分割成兩個面片

• 新節點在當前節點前向空間,插入左子樹

• 新節點在當前節點背向空間,插入右子樹

• 當前節點爲空,直接插入新節點

• 直到所有面片都被插入樹中

 

簡單來說,若要創建BSP樹,需遞歸將一個平面空間一分爲二,並將幾何體歸類到這兩個空間中來完成。

 

1.2.2 BSP樹的遍歷


從根節點開始,判斷輸入位置與當前分割平面的“前”、“後”關係,

“前”則遍歷左子樹,“後”則遍歷右子樹,遞歸到葉子節點終止。

用平面方程 Ax + By + Cz + D = 0判斷前後位置,可用 D(x0, y0, z0 ) = Ax0 + By0 +Cz0 +D 進行判別,其中:

• D > 0:在平面前面

• D = 0:在平面上

• D < 0:在平面後面

 

這裏貼出從後向前遍歷BSP的示例代碼:

traverse_tree(bsp_tree* tree,point eye)
{
	location = tree->find_location(eye);

	if(tree->empty())
		return;

	if(location > 0)      // if eyeinfront of location
	{
		traverse_tree(tree->back,eye);
		display(tree->polygon_list);
		traverse_tree(tree->front,eye);
	}
	else if(location < 0) // eye behind location
	{
		traverse_tree(tree->front,eye);
		display(tree->polygon_list);
		travers_tree(tree->back,eye);
	}
	else                  // eyecoincidental with partition hyperplane
	{
		traverse_tree(tree->front,eye);
		traverse_tree(tree->back,eye);
	}
}


 

1.2.3 BSP樹的種類


在計算機圖形學中,BSP樹有兩大類別,分別是爲軸對齊(Axis-Aligned)BSP樹和多邊形對齊(Polygon-Aligned)BSP樹。下面分別進行介紹。

 

1.2.4 軸對齊BSP樹 | Axis-aligned BSP tree

 

軸對齊BSP樹可以按如下方式來創建。首先,將整個場景包圍在一個AABB(軸對齊包圍盒,Axis-Aligned Bounding Box)中,然後以遞歸的方式將這個包圍盒分爲若干個更小的盒子。

現在,考慮一下任何遞歸層次的盒子。選取盒子的一個軸,生成一個與之垂直的平面,將盒子一分爲二。有一些方法可以將這個分割平面固定,從而將這個盒子分爲完全相同的兩部分,而也有其他的一些方法,允許這個平面在位置上有一些變化。與分割平面相交的物體,要麼存儲在這個層次上,成爲兩個子集中的一員,要麼被這個平面分割爲兩個不同的物體。經過這個過程,每個子集就處於一個比較小的盒子中,重複這個平面分割的過程,就可以對每個AABB進行遞歸細分,直到滿足某個標準才終止這個分割過程。而這個標準,通常是用戶定義的樹最大深度,或者是盒子裏面所包含的幾何圖元數量,需低於用戶定義的某個值。

 

分割平面的軸線和位置對提高效率至關重要。一種分割包圍盒的方法就是軸進行循環。即在根節點,沿着x軸對盒子進行分割,然後再沿着y軸對其子盒子進行分割,最後沿z軸對其孫盒子進行分割。這樣,就完成了一個循環週期。使用這種分割策略的BSP樹常被稱爲k-d樹。而另一種常見策略是找到盒子的最長邊,沿着這條邊的方向對盒子進行分割。

 

下圖展示了一種軸對齊BSP樹的分割過程。

 


圖5 軸對齊 BSP樹。在這個示例中,允許空間分割位於軸上的任意位置,不一定必須在中點位置,形成的空間體分別用A~E來標誌。右圖所示的樹是當前的BSP樹數據結構,每個葉子節點表示一個區域,區域內容顯示在下方。注意,黃色三角形在物體列表中含有C和E兩個區域,因爲它同時覆蓋了這兩個區域。

 

值得一提的是,從前到後的粗排序(Rough Front-to-Back Sorting)是軸對齊BSP樹的一種應用示例,這種方法對於遮擋剔除算法非常有用。而在視點的另一側進行遍歷,可以得到從後向前的粗排序(Rough Fack-to-Gront Sorting),這對於透明排序非常有用。且還可以用來測試射線和場景幾何體相交的問題,只需將視點位置換爲射線原點即可,另外還可以用於視錐裁剪。

 

 

1.2.5 多邊形對齊BSP樹 | Polygon-aligned BSP tree

 

多邊形對齊BSP樹(Polygon-alignedBSP tree)是BSP樹的另一大類型,其中將多邊形作爲分隔物,對空間進行平分。也就是說,在根節點處,選取一個多邊形,用這個多邊形所在平面將場景中剩餘多邊形分爲兩組。對於與分割平面相交的多邊形來說,沿着其中的交線將這個多邊形分爲兩部分。然後,在分割平面的每個半空間中,選取另外一個多邊形作爲分隔物,只對這個分隔物所在平面的多邊形進行繼續分割,直到所有的多邊形都在BSP樹中爲止。

需要注意,多邊形對齊BSP樹的創建是一個非常耗時的過程,這些樹通常只需計算一次,可以存儲起來進行重用。

 

下圖是一個多邊形對齊BSP樹的圖示。

 

圖6 多邊形對齊BSP樹。左圖中,多邊形分別用A~G表示。首先,用多邊形A對空間進行分割,生成的兩個半空間分別由多邊形B和C分割,由B形成的分割平面與左下角的多邊形相交,將其分割爲多邊形D和E。最後形成的BSP書如右圖所示。

 

因爲完全不平衡樹的效率非常低,所以多邊形對齊BSP樹分割時最好是形成平衡樹,即每個葉子節點的深度相同或者相差一個層次的樹。


多邊形對齊BSP樹的一個典型性質就是對於一個給定的視點來說,可以對該結構按照從後往前(或者從前往後)的順序進行嚴格遍歷,而軸對齊的BSP通常只能給出粗略的排序順序。所以,基於多邊形對齊BSP樹的此性質,建立了嚴格的前後順序,可以配合畫家算法來繪製整個場景,而無需Z緩衝。

多邊形對齊BSP樹的其他應用也包括相交測試和碰撞檢測等。

 

 

1.2.6 BSP樹的延伸閱讀材料推薦

 

[1] http://web.cs.wpi.edu/~matt/courses/cs563/talks/bsp/bsp.html

[2] https://pdfs.semanticscholar.org/90e4/c4a65b4b04d9e2374e5753659c102de4c0eb.pdf

[3] https://en.wikipedia.org/wiki/Binary_space_partitioning

[4] http://archive.gamedev.net/archive/reference/programming/features/bsptree/bsp.pdf

 

 

 

1.3 八叉樹 | Octrees


八叉樹(octree),或稱八元樹,是一種用於描述三維空間的樹狀數據結構。八叉樹的每個節點表示一個正方體的體積元素,每個節點有八個子節點,這八個子節點所表示的體積元素加在一起就等於父節點的體積。一般中心點作爲節點的分叉中心。

簡單來說,八叉樹的空間劃分方式很簡單,即遞歸地進行規整地1分爲8的操作。如下圖,把一個立方體分割爲八個同樣大小的小立方體,然後遞歸地分割出更的小立方體。這個就是八叉樹的命名來源。這種分割方式可以得到比較規則的結構,從而使得查詢變得高效。


圖7 八叉樹的構成 @wiki

 

相似地,四叉樹是把一個二維的正方形空間分割成四個小正方形。而八叉樹是四叉樹的三維空間推廣。

 

圖8 八叉樹的實現 @http://thomasdiewald.com/blog/?p=1488



圖9 八叉樹的實現 @http://thomasdiewald.com/blog/?p=1488



圖10 八叉樹的實現 @http://thomasdiewald.com/blog/?p=1488

 

上述三幅圖也均來自《Space Partitioning: Octree vs.BVH》http://thomasdiewald.com/blog/?p=1488一文,這是一篇比較八叉樹和BVH的有趣的文章,有興趣的朋友可以閱讀一下。

 

 

 

1.3.1 鬆散八叉樹 Loose Octrees


鬆散八叉樹的基本思想和普通八叉樹一樣,但是每個長方體的大小選中比較寬鬆。而如果一個普通長方體的邊長爲l,那麼可以用kl來代替,其中k>1,如下圖所示。


圖11  一個普通八叉樹和鬆散八叉樹的比較。圖中黑色的原點表示長方形的中心點(第一次細分)。在左圖中,星形物體刺穿了一個普通八叉樹的一個分割平面。,這樣,一種選擇就是將這個星型物體放在最大的長方形中(根節點的長方體)。而右圖所示爲一個k=1.5的鬆散八叉樹,也就是將長方體放大了50%,如果將這些長方體稍微移動,就可以保證區分出它們。這樣,這個星型多邊形就完全位於左上角的長方形之中。

 

 

1.3.2 八叉樹延伸閱讀材料

 

[1] http://web.cs.wpi.edu/~matt/courses/cs563/talks/color_quant/CQoctree.html

[2] https://en.wikipedia.org/wiki/Octree

[3] Losasso F, Gibou F, Fedkiw R.Simulating water and smoke with an octree data structure[C]//ACM Transactionson Graphics (TOG). ACM, 2004, 23(3): 457-462.

 

1.4 場景圖 | Scene Graphs


BVH、BSP樹和八叉樹都是使用某種形式的樹來作爲基本的數據結構,它們的具體區別在於各自是如何進行空間分割和幾何體的存儲,且他們均是以層次的形式來保存幾何物體。然而三維場景的繪製不僅僅是幾何體。

 

然而,渲染三維場景不僅僅只是渲染出幾何圖形,對動畫,可見性,以及其他元素的控制,往往需要通過場景圖(Scene Graphs)來完成。

 

場景圖被譽爲“當今最優秀且最爲可重用的數據結構之一。”Wiki中的對場景圖的定義是“場景圖(Scene Graph)是組織和管理三維虛擬場景的一種數據結構,是一個有向無環圖(DirectedAcyclic Graph, DAG)。”

場景圖是一個面向用戶的樹結構,可以通過紋理、變換、細節層次、渲染狀態(例如材質屬性)、光源以及其他任何合適的內容進行擴充。它由一棵以深度優先遍歷來渲染整個場景的樹來表示。

 

圖12 通過創建場景圖來表示對象

 

另外提一句,開源的場景圖有Open Scene Graph和OpenSG等,有興趣的朋友們可以進行進一步瞭解。

 

場景圖的延伸閱讀材料

[1] http://www.openscenegraph.org/index.php/documentation/knowledge-base/36-what-is-a-scene-graph

[2] https://en.wikipedia.org/wiki/Scene_graph

[3] http://archive.gamedev.net/archive/reference/programming/features/scenegraph/index.html

 

 

 


二、裁剪技術 | Culling Techniques



裁剪(Culling)的字面意思是“從大量事物中進行刪除”。在計算機圖形學中,相對應的就是裁剪技術(Culling Techniques)所要做的工作——“從大量遊戲事物中進行刪除”。所謂的“大量事物”就是需要繪製的整個場景,刪除的是對最終圖像沒有貢獻的場景部分,然後將剩餘場景發送到渲染管線。因此,在渲染方面通常使用“可見性裁剪(Visibility Culling)”這個術語。但其實,裁剪也可以用於程序的其他部分,如碰撞檢測(對不可見物體進行不十分精確的計算)、物理學計算,以及人工智能(AI)領域。

 

與渲染相關的裁剪技術,常見的有背面裁剪(Backface Culling),視錐裁剪(View  Frustum Culling),以及遮擋裁剪(Occlusion Culling,也常常稱作遮擋剔除)。

  • 背面裁剪即是將背向視點的物體刪除,是一種非常簡單直觀的操作,只能一次一對個單一多邊形進行操作。
  • 視錐裁剪是將視錐之外的多邊形刪除,相對而言,這種操作比背面裁剪稍微複雜。
  • 遮擋裁剪,是將被其他物體遮擋的物體進行刪除,這種操作在三者中最爲複雜,因爲其需要聚集一個或者多個物體,同時還需使用其他物體的位置信息。

 

理論上,裁剪操作可以發生在渲染管線的任何一個階段,而且對於一些遮擋裁剪算法來說,甚至可以預先計算出來。對於在硬件中實現的裁剪算法來說,有時只需啓動/禁止或者設置一些裁剪函數即可。而爲了進行完全控制,我們可以在應用程序階段在(CPU上)實現一些裁剪算法。假設瓶頸位置不在CPU上,渲染最快的多邊形就是沒有送到圖形加速器管線上的多邊形,裁剪通常可以使用幾何計算來實現,但也不侷限於此。例如,某算法也可以使用幀緩衝中的內容。

而理想的裁剪算法預期是隻發送所有圖元中通過管線的精確可見集(Exact Visible Set ,EVS)。

 

下圖是三種裁剪技術的對比圖示。


圖13 三種裁剪技術的對比,其中被裁剪掉的幾何體用虛線表示

 

 下文接下來將分別介紹背面裁剪、層次視錐裁剪、入口裁剪、細節裁剪、遮擋剔除等幾種裁剪技術。



 

三、背面裁剪 | Backface Culling

 

假設你正在觀察一個場景中不透明的球體。大約有一半的球體是不可見的。那麼,可以從中這個例子裏得到一個衆所周知的結論,那就是,對不可見的內容不需要進行渲染,因爲它們對最終的渲染圖像沒有貢獻。

 

不需要對球體的背面進行處理,這就是背面裁剪的基本思想。對於一組物體來說,還可以一次性地進行背面裁剪,這也稱爲聚集背面裁剪(Clustered Backface Culling)。


圖14 確定多邊形是否背向的兩種不同測試。左圖所示爲屏幕空間的測試情形,三角形和四邊形是正向,而七邊形是背向。對背向的七邊形,無需進行光柵化。

右圖爲視點空間中背面測試情形,多邊形A是背向的,而B和C是正向的。多背向的多邊形A,無需進行光柵化。





四、層次視錐裁剪| Hierarchical View Frustum Culling



如上文所示,只需對完全或者部分在視錐中的圖元進行渲染。一種加快渲染速度的方法便是將每個物體的包圍體與視錐進行比較,如果包圍體位於視錐之外,那麼便不需要渲染包圍體中的幾何體。由於這些計算在CPU上進行,因此包圍體中的幾何體不需要通過管線中的幾何和光柵階段。相反,如果包圍體在視錐內或者與視錐相交,那麼包圍體中的內容就是可見的,所以必須發送到渲染管線中去。

 

利用空間數據結構,可以分層地來應用這種裁剪。例如,對於層次包圍體BVH來說,從根節點進行先序遍歷(Preorder Transversal),就可以完成這一任務。

 

圖15 左圖所示爲一組幾何體和相應的包圍體(球體),從視點位置使用視錐裁剪來渲染場景。右圖所示爲層次包圍體,視節點的包圍體與視錐相交,對子包圍體進行遍歷測試,左子樹的包圍體與視錐相交,而其中只有一個子節點與視錐相交,另外一個子包圍體體外邊,無需發送到管線。根節點中間子樹的包圍體完全位於視錐內部,可以立即進行渲染,右邊的子樹的包圍體也完全位於視錐內部,所以不需要進一步測試就可以渲染整個子樹。

 

視錐裁剪操作位於應用程序階段(CPU),這意味着幾何階段和光柵階段都可以從中受益,對於大場景或者一定的相機視線來說,場景只有一小部分是可見的,只需要將這部分發送到渲染管線。可期望獲得一定的加速效果,視錐裁剪技術利用了場景中的空間相關性,因爲可以將彼此靠近的物體包圍在一個包圍體中,而且幾乎所有包圍體都是以層次形式聚集在一起。

 

除了層次包圍體,其他的空間數據結構同樣也可以用於視錐裁剪,包括上文提到的八叉樹和BSP樹。但是當渲染動態場景時,這些方法便會顯得不夠靈活,不如層次包圍體。

 

 

 

五、入口裁剪 | Portal Culling



對建築物模型來說,很多裁剪方面的算法可以歸結爲入口裁剪(Protal Culling)。在這個方向,最早的算法由Airey提出,隨後Teller和Sequin,以及Teller和Hanrahan構造出了更高效,更復雜的算法。

 

入口裁剪算法的基本思想是,在室內場景中,建築物牆面通常充當大的遮擋物,通過每個入口(如門或者窗戶)進行視錐裁剪。當遍歷入口的時候,就減小視錐。

使得與入口儘可能緊密貼合。因此,可以將入口裁減算法看作是視錐裁剪算法的一種擴展,且需將位於視錐之外的入口丟棄。

 

入口裁剪方法以某種方式對場景進行預處理,可以是自動形式,也可以是手動形式,可以將場景分割爲一系列單元(Cells),其通常對應於建築物中的房間或者走廊;鏈接進階房間的門和窗口稱爲入口(Protals)。單元中的每個物體和單元的牆面可以存儲在一個與單元關聯的數據結構中,還可以將鄰接單元和鏈接這些單元的入口信息保存在一個臨接圖中。

 

圖16 入口裁剪 單元分別從A到H,入口是連接單元的通路,只對穿過入口能看到的幾何體進行渲染。


圖17 入口裁剪,左圖爲房間頂視圖,白線表示每一個入口的截錐體減少的方式。紅線是在鏡子上反射圓臺來產生的。實際視圖顯示在右側的圖像中。

 



 

六、細節裁剪 | Detail Culling



細節裁剪(Detail Culling)是一種通過犧牲質量換取速度的技術。其基本原理是,當視點處於運動的時候,場景中的微小細節對渲染出的圖像貢獻甚微。,當視點停下來的時候,通常禁止細節裁剪。

考慮一個具有包圍體的問題,將這個包圍體投射到投影平面,然後以像素爲單位來估算投影面積,如果像素的數量小於用戶定義的閾值,那麼不對這個物體進行進一步處理。基於這個原因,細節裁剪也往往被稱爲屏幕尺寸裁剪(Screen-Size Culling)。細節裁剪也可以在場景圖上以層次形式來實現,幾何階段和光柵階段都可以從這個算法中受益。

另外,細節裁剪還可以作爲一種簡化的LOD技術來實現,其中一個LOD是整個模型,另外一個LOD是空物體。

 

 


七、遮擋剔除 | Occlusion Culling

 

遮擋裁剪(Occlusion Culling),也常被稱作遮擋剔除。

聊一聊遮擋剔除必要性。不難理解,可見性問題可以通過Z緩衝器的硬件構造來實現,即使可以使用Z緩衝器正確解決可見性問題,但其中Z緩衝並不是在所有方面都不是一個很“聰明”的機制。例如,假設視點正沿着一條直線觀察,其中,在這條直線上有10個球體,雖然這10個球體進行了掃描轉換,同時與Z緩衝器進行了比較並寫入了顏色緩衝器和Z緩衝器,但是這個從這個視點渲染出的圖像只會顯示一個球體,即使所有10個球體都將被光柵化並與Z緩衝區進行比較,然後可能寫入到顏色緩衝區與Z緩衝區。

下圖中間部分顯示了在給定視點處場景的深度複雜度,深度複雜度指的是對每個像素重寫的次數。對於有10個球體的情形,最中間的位置,深度複雜度爲10,因爲在這個地方渲染了10個球體(假設背面裁剪是關閉的),而且這意味着其中有9次像素寫入是完全沒有必要的。


圖18 圖示:遮擋剔除必要性

 

像上圖這樣無聊極端的場景,現實生活中很難找到,但其描述的這種密集性很高的模型的情形,在現實生活中卻很常見,如熱帶雨林,發動機,城市,以及摩天大樓的內部。下圖顯示了曼哈頓式城市的示例。

 


圖19 城市鳥瞰圖,左圖爲視錐裁剪後的圖示,中圖爲視錐裁剪後的圖示,右圖所示爲遮擋剔除和視錐裁剪後的圖示

 

從上面給出的示例可以看出,這種用來避免低效率的算法可以帶來速度上的補償,具體可以將這些方法歸類爲遮擋裁剪算法(Occlusion Culling Algorithms),因爲它們都試圖裁剪掉被遮擋的部分,也就是被場景中其他物體遮擋的物體,最優的遮擋裁剪算法只選擇其中可見得的部分。

 

有兩種主要形式的遮擋裁剪算法,分別是基於點的遮擋裁剪和基於單元的遮擋裁剪。如下圖所示。

 

圖20 左圖所示爲基於點的可見性,右圖所示爲基於單元的可見性,其中單元是一個長方形,從中可以看出,從視點左邊看上去,有些圓被遮擋了,但是從右邊看上去,這些圓卻是可見的,因爲可以從單元的某個位置到這些圓畫一些射線,這些射線沒有和任何遮擋物相交


下圖所示爲一種遮擋裁剪算法的僞代碼。

 

 

 有多種不同種類的遮擋剔除算法:

  • HardwareOcclusion Queries 硬件遮擋查詢
  • HierarchicalZ-Buffering 層次Z緩衝
  • OcclusionHorizons 遮擋地平線
  • OccluderShrinking 遮擋物收縮
  • FrustumGrowing視錐擴張
  • Virtualoccluder 虛擬遮擋物算法
  • ShaftOcclusion Culling 軸遮擋裁剪
  • TheHOM algorithm 層次遮擋映射算法
  • RaySpace Occlusion Culling 射線空間遮擋剔除

下面將對其中的常見幾種介紹。



7.1   硬件遮擋查詢 | Hardware Occlusion Queries


現代GPU可以以一種特殊的渲染模式來支持遮擋剔除。通過硬件遮擋查詢(Hardware Occlusion Queries),我們能夠直接獲得所提交的物體是否被繪製到場景中。

簡單來說,硬件遮擋查詢的基本思想是,當和Z緩衝器中內容進行比較時,用戶可以通過查詢硬件來找到一組多邊形是否可見的,且這些多邊形通常是複雜物體的包圍體(如長方體或者k-DOP)。如果其中沒有多邊形可見,那麼便可將這個物體裁剪掉。硬件實現對查詢的多邊形進行光柵化,並且將其深度和Z緩衝器進行比較。

更多細節,可以參考這篇論文:

Bittner J, Wimmer M, Piringer H, et al. Coherent hierarchical culling: Hardware occlusion queries made useful[C]//Computer Graphics Forum. Blackwell Publishing, Inc, 2004, 23(3): 615-624.

 



7.2   層次Z緩衝 | Hierarchical Z-Buffering


層次Z-緩衝算法(Hierarchical Z-Buffering ,HZB)是由Greene等人提出的一種算法,對遮擋剔除的研究有着顯著的影響。儘管其在CPU上很少使用,但該算法是GPU上做Z-Culling(深度裁剪)的基礎。

層次Z-緩衝算法用八叉樹來維護場景模型,並將畫面的Z緩衝器作爲圖像金字塔(也稱爲Z-金字塔(Z-pyramid)),該算法因此在圖像空間中進行操作。其中,八叉樹能夠對場景的遮擋區域進行層次剔除,而Z-金字塔則可以對單個基元和邊界體積進行層次Z緩衝。 因此Z-金字塔可以作爲此算法的遮擋表示。

 

圖21 使用HZB算法的遮擋裁剪示例,顯示了一個複雜的場景(右下),相應的Z-pyramid(左圖),以及八叉樹細分(右上)。通過從前到後遍歷八叉樹並裁剪遇到的八叉樹節點,此算法可以僅訪問可見的八叉樹節點及其子節點(右上角的節點),的容器只對可見包圍體中的多邊形進行渲染。在這個例子中,遮擋八叉樹節點的裁剪可以將深度複雜度從84,降低到了2.5。

 

 更多細節,可以參考這篇論文:

Greene N, Kass M, Miller G. Hierarchical Z-buffer visibility[C]//Proceedings of the 20th annual conference on Computer graphics and interactive techniques. ACM, 1993: 231-238.

 

 

7.3   其他遮擋剔除技術 | Other Occlusion Culling Techniques


前人在遮擋剔除方面已經做了大量的工作,但由於GPU的性能早已超過了CPU,所以這些算法中的大部分已經不再受青睞。因此這邊只對一些常見的方案做一些簡單介紹,至少他們還是值得傳遞下去的一些知識,因爲架構和硬件的不斷髮展。

而隨着多核系統的崛起,CPU端有了額外的資源,但難以直接給渲染本身帶來提升,但同時使用單核或多核來執行基於單元的可見性測試或者其他進行方案,也已變得可以想象。


 

7.3.1 層次遮擋映射算法 | Hierarchical OcclusionMap


層次遮擋映射(Hierarchical Occlusion Map ,HOM))算法,類似層次Z緩衝算法,是一種啓用分層圖像空間剔除的方法。但其也不同於層次Z緩衝,因爲它提供了使用近似遮擋剔除的能力。 HOM算法的基本思想是,每幀建立一個分層深度緩衝區,用於遮擋測試。並且在每個級別使用不透明度閾值來確定是否有足夠的要渲染的對象是可見的。如果只有一小部分的對象是可見的,那麼該對象被剔除。但作爲一個基於CPU的算法系統,這個算法已經不受歡迎了。

 

對此算法感興趣的朋友,可以進一步參考這篇論文:

 Zhang H, Manocha D, Hudson T, et al. Visibility culling using hierarchical occlusion maps[C]//Proceedings of the 24th annual conference on Computer graphics and interactive techniques. ACM Press/Addison-Wesley Publishing Co., 1997: 77-88.

 


7.3.2 遮擋地平線算法 | Occlusion Horizons

 

遮擋地平線(Occlusion Horizons)算法是一種非常簡單的、基於點的可見性算法,可以對遮擋物進行融合,在基於點的可見性算法演示方面非常有用。由Wonka和Schmalstieg等人首先提出,並通過圖形硬件將其進行了實現,隨後Downs等人使用幾何計算的方法將其獨立開發實現,最早於1995年在電腦遊戲中使用。

 

顧名思義,遮擋地平線算法的基本思想是裁剪掉位於地平線之間和之下的物體。 這種類型的算法經常被用來高效繪製如城市和村莊一樣的城市環境。

通過從前到後渲染一個場景,我們可以定位到地平線在哪裏進行渲染,而任何在當前地平線之後和之下的物體都可以被裁剪掉。

 

對此算法感興趣的朋友,可以進一步參考這篇論文:

Downs L, Möller T, Séquin CH. Occlusion horizons for driving through urban scenery[C]//Proceedings of the2001 symposium on Interactive 3D graphics. ACM, 2001: 121-124.

 

 

7.3.3 遮擋物收縮與視錐擴張算法 | Occluder Shrinkingand Frustum Growing


上文給出的遮擋地平線算法是基於點的可見性來判斷的。有些時候採用基於單元的可見性方法更合適,但基於單元通常比基於點的可見性計算複雜度要高得多。Wonka等人提出了一種稱爲遮擋物收縮(Occluder Shrinking)的方法,可以使用基於點的遮擋算法來生成基於單元的可見性,根據給定的量來縮小場景中所有遮擋物來達到延伸有效可見點的目的。他們也提出了一種視錐擴張(Frustum Growing)技術,通常與Occluder Shrinking算法一起配合使用。

對此算法感興趣的朋友,可以進一步參考如下三篇論文:

[1] Wonka P, Wimmer M, Schmalstieg D. Visibility preprocessingwith occluder fusion for urban walkthroughs[M]//Rendering Techniques 2000.Springer, Vienna, 2000: 71-82.

[2] Wonka P, Wimmer M, Sillion F X. Instantvisibility[C]//Computer Graphics Forum. Blackwell Publishers Ltd, 2001, 20(3):411-421.

[3] Wonka, Peter, Occlusion Culling for Real-Time Rendering ofUrban Environments,Ph.D. Thesis, The Institute of Computer Graphics andAlgorithms, Vienna University of Technology, June, 2001. Cited on p. 679

 

 


 

八、層次細節 | LOD,Level of Detail

 


細節層次(Level of Detail,LOD)的基本思想是當物體對渲染出圖像貢獻越少,使用越簡單的形式來表達該物體。這是一個已經在各種遊戲中廣泛使用的基本優化技術。

例如,考慮一個包含1萬個三角形的汽車,其中所包含的細節信息比較豐富。當視點靠近物體時,可以使用詳細的細節表示,而當視點遠離物體時,比如僅需覆蓋200個像素,則完全無需渲染出1百萬個三角形,相反,我可以使用諸如只有1000個三角形的簡化模型。而由於距離的原因,簡化後的模型與細節較豐富的模型看上去其實很接近。以這種方式,可以顯著地提高渲染的性能開銷。


圖22 LOD圖示

 

 

 

圖23 LOD圖示

 

NVIDIA提供了一個非常有趣的網站,可以在網頁上自己拖動分界線進行交互,查看《古墓麗影:崛起》的遊戲畫面不同級別的LOD顯示情況,可以對LOD有一個很直觀的認識,感興趣的同學不妨試試:

http://images.nvidia.com/geforce-com/international/comparisons/rise-of-the-tomb-raider/alt/rise-of-the-tomb-raider-level-of-detail-interactive-comparison-001-very-high-vs-low-alt.html

 

圖24 《古墓麗影:崛起》不同LOD的在線對比網站 @NVIDIA

 

通常情況下,霧效會與LOD一起使用。這樣我們可以完全跳過對一些物體的渲染,直接用不透明的霧來進行遮擋。另外,霧效的機制可以實現下文所介紹到的Time-Critical LOD Rendering。通過將元平面移近觀察者,可以更早地剔除對象,並且可以實現更快速的渲染以保持幀速率。

 

一般情況下,完整的LOD算法包含3個主要部分:

  • 生成Generation
  • 選擇Selection
  • 切換Switching

其中,LOD的生成就是生成不同細節的模型表示。RTR3書中12.5節中討論的簡化方法可用於生成所需數量的LOD。另一種方法是手工製作具有不同數量的三角形模型。選擇機制就是基於某種準則選取一個層次細節模型,比如屏幕上的評估面積。最後,我們還需要從一個細節層次轉換到另一個細節層次,而這個過程便稱爲LOD切換。

 

下面對LOD的切換和選取相關的算法進一步說明。



8.1   LOD的切換 | LOD Switching


當從一個LOD切換到另一個LOD的時候,忽然的模型替換往往會引起觀察者的注意。這種現象被稱爲突越(Poping)。這裏有幾種不同的LOD切換方法,有着不同的特性:

  • 離散幾何LOD | Discrete Geometry LODs
  • 混合LOD | Blend LODs
  • 透明LOD | Alpha LODs
  • 連續LOD和幾何形變LOD | CLODs and Geomorph LODs

 

8.1.1 離散幾何LOD | Discrete Geometry LODs


離散幾何LOD是最簡單的LOD算法,不同的表示是不同圖元數量的同一模型,但這種方法突越現象嚴重。

 


8.1.2 混合LOD | Blend LODs


在概念上,完全可能存在一種直觀的方法,從一個LOD切換到另一個LOD,只需要在較短的時間內在兩個LOD之間執行一個線性混合,這種方法無疑可以得到一種比較平滑的切換,但是這種混合操作的代價較高。渲染兩個LOD要比一個LOD需要更大開銷,因此也就違背了LOD的初衷。但LOD切換通常發生在較短時間內容,在同一時間也不是對場景中所有物體進行切換,所以依然可以從中獲益。

Giegl等人在《Unpopping: Solvingthe Image-Space Blend Problem for Smooth Discrete LOD Transition 》這篇文章中提出了一種方法,實際應用的效果較爲出色。思路是在兩個LOD之間有一個alpha值的過渡,有興趣的朋友可以進一步瞭解。



8.1.3 透明LOD | Alpha LODs


完全避免突越現象的一種簡單方法便是使用alpha LOD。其中並沒有使用同一物體很多不同細節的實例,而且每個物體只有一個實例。

隨着LOD選取度量值(如與物體之間的距離)的增大,物體整體透明度也隨之增大(也就是alpha值減小),當完全透明時,物體最終就會消失。

這種方法的優點是,比離散幾何LOD方法上感覺更連續一些,可以避免突躍現象。此外,由於物體最終會完全消失而不需要進行渲染,可以得到很好的加速效果。


圖26 使用Alpha LOD對圖中的圓錐體進行渲染,當距離圓錐體較遠時,就提高它的透明度,直到最後消失。直線左邊的圖像是從同一距離處進行的觀察,而直線右邊的圖像是左邊圖像不同尺寸的情形。

 


8.1.4 連續LOD和幾何形變LOD | CLODs and Geomorph LODs


連續細節層次(Continuous Level of Detail , CLOD)的基本思想是基於LOD選取值來精確決定可見多邊形的數量。在100m遠處,模型包含1000個多邊形,當移動的到101m的地方時,模型減少到998個多邊形。

 

幾何形變層次細節(Geomorph LODs)是基於簡化生成的一組離散模型,且其中模型頂點之間的鏈接關係保持不變。而網格簡化的過程可以從一個複雜的物體中創建各種不同的LOD模型,具體做法可以參見《Real-Time Rendering 3rd》12.5.1一節,一種方法就是創建一組離散的LOD,然後按照上文中提到的方法來使用。這裏的邊塌陷(Edge Collapse Methods)方法有一個有趣的性質,即允許在不同的LOD之間採用其他過渡方法。

 


圖27 幾何形變LOD的簡化模型圖示。左邊和右邊的圖像所示分爲爲低細節層次和高細節層次的模型,中間的圖像是在左右模型中間進行插值生成的幾何變形模型。注意。中間的牛模型和右邊的模型具有相同數量的頂點和三角形。


 

 

8.2 LOD的選取 | LOD Selection


給定一個物體不同細節層次,必須做一個選擇,決定渲染或者混合其中的哪一個層次,這就是LOD選擇(LOD selection)的任務。有幾種不同的LOD選擇方案,這些方案也可以用於遮擋裁剪算法。

 

常見的三種LOD選取技術是:

  • 基於距離的LOD選取( Range-Based )
  • 基於投影面積的LOD選取( Projected Area-Based )
  • 基於滯後的LOD選取(Hysteresis)

 

依然是分別進行簡要概述。


 

8.2.1 基於距離的LOD選取 |Range-Based


選取LOD的一種常用方法是將物體的不同LOD於不同距離聯繫起來。細節最豐富的LOD的距離從0到一個用戶定義值r1之間,下次層次的LOD的距離位於r1~r2之間,以此類推,如下圖:


圖28 左圖爲基於距離的LOD的原理示例圖。其中,LOD3是一個空物體,也就是表示當物體大於r3時,就不渲染任何物體,因爲物體對圖像的貢獻度不夠。右圖爲場景中的一個LOD節點,它只有一個子節點基於r。

 

 

8.2.2 基於投影面積的LOD選取 | Projected Area-Based


基於投影面積的LOD選取,顧名思義,即投影面積越大,就選取細節越豐富的LOD。

 


8.2.3 基於滯後的LOD選取 |Hysteresis


若用於確定LOD度量標準圍繞某個值ri在畫面之間是變化的,那麼就會出現不必要的突躍現象,也就會在不同的LOD之間來回快速切換。對此,可以引入一個圍繞ri值的滯後來解決這個問題。如下圖,這是一個基於距離的LOD,可以應用於任何類型,當r增大時,使用上一行的LOD距離;當r減小時,使用下面一行的LOD距離。

 

圖28 灰色區域表示的是基於滯後的LOD選取方法的滯後區域

 

8.2.4 其他LOD選取方法

 

基於距離和基於投影面積的LOD選取最常用。除了投影面積,Funkhouser等人《Adaptive Display Algorithm for Interactive Frame Rates During Visualization of Complex Virtual Environments》一文中還提出了使用物體的重要程度,運動,以及焦點等方法來作爲LOD的選取方案。

觀察者的注意力是一個重要的因素。例如,在一個體育遊戲中,控制球的圖像是用戶最注意的地方,那麼其他的部分就可以相對來說低的層次細節,具體可以參見論文《Never Let ’Em See You Pop — Issues in Geometric Level of Detail Selection,”》。

 另外,也可以使用整體的可見性,如通過密集的葉子看到的附近對象可以用較低的LOD呈現。以及限制整體高級別LOD的數量以控制渲染的三角形總數的開銷。其他的一些LOD選取的因素有顏色、以及紋理等。此外,也可以使用感知尺度來選擇LOD。




8.3 時間臨界LOD渲染 | Time-Critical LOD Rendering


我們通常希望渲染系統有一個固定的幀率,實際上這就是通常所說的“硬實時(HardReal Time)”或者時間臨界(Time-Critical)。通常給定這類系統一個特定時間段(如30ms),必須在這段時間內完成相應的任務(如圖像渲染);當時間到的時候,必須停止處理。如果場景中的物體用LOD來表示,則可以實現硬實時渲染算法。

Funkhouser等人在《Adaptive display algorithm for interactive frame rates during visualization of complex virtual environments》一文中提出了一種啓發式算法(heuristic algorithm),對於場景中的所有可見物體,可以自適應選取細節層次,從而滿足固定幀率的要求。這個算法在場景中具有預測性,因爲可見物體的LOD選取基於預期幀率和可見物體。這種啓發式算法與對應的反應性算法(reactive algorithm)形成了鮮明對比,後者的LOD選取基於前一幀畫面的渲染時間。

 




九、大型模型的渲染 | Large Model Rendering



人們一直都認爲所渲染的模型是適合存放到計算機主內存中的,但通常的情況其實並非如此。一個簡單的例子便是渲染一個地球模型。這是一個非常複雜的話題,《Real-Time Rendering 3rd》中也僅提了一下,然後列了一些相關文獻,這裏也僅簡單說一下。

 爲了簡單起見,大型模型的渲染通常會使用多個嵌套的數據結構,使用一個四叉樹形式的數據結構來覆蓋地球表面。而在每個葉節點內部可以根據具體內容使用不同的數據結構。此外,爲了保持合適的幀率,即將進入視野中的模型區域,在需要之前從磁盤中分頁,而四叉樹也可以在這裏使用的。

 值得一提的是,在RTR3書中6.2.5節(對應本系列文章第五篇的5.4 節)討論了裁剪圖(clip-mapping)策略,便是管理大型紋理的一種技術。

 

將不同的加速算法進行結合是不容易的事情。Aliaga等人將幾種算法結合起來,用於非常大型的場景,具體可以參考如下3篇文章:

[1] Akeley, K., and T. Jermoluk, “High-Performance Polygon Rendering,” Computer Graphics (SIGGRAPH ’88 Proceedings), pp. 239–246, August 1988. Cited on p.22
[2] Akeley, K., P. Haeberli, and D. Burns, tomesh.c, a C-program on the SGI Developer’s Toolbox CD, 1990. Cited on p. 543, 553, 554
[3] Akeley, Kurt, “RealityEngine Graphics,” Computer Graphics (SIGGRAPH 93 Proceedings), pp. 109–116, August 1993. Cited on p. 126

 

而關於大型模型的渲染,有興趣的朋友可以近一步參考這篇SIGGRAPH筆記:

Manocha D, Aliaga D. Interactive walk throughs of largegeometric datasets[J]. SIGGRAPH 00 Course notes, 2000.

 


 

十、點渲染 | Point Rendering

 

在1985年,Levoy 和 Whitted寫了一篇具有開創性的技術報告《The use of points asa display primitive》。在這篇報告中,他們提出點作爲一種新的圖元來進行渲染,基本思想是用一個大的點集來表示物體表面並予以渲染。在隨後的通道中,使用高斯濾波來填充渲染點之間的間隙。而高斯濾波器的半徑取決於表面上點的密度和屏幕上的投影密度。有興趣的朋友可以進一步瞭解。PDF地址在這裏:

https://www.cs.princeton.edu/courses/archive/spring01/cs598b/papers/levoy85.pdf

 

 

圖29 根據點渲染的方法渲染出來的模型,使用原型油彩(circular splats)。左圖爲名爲Lucy的天使模型,擁有10萬個頂點。但在渲染中只用到了300萬個油彩,中圖、和右圖是對左邊圖的放大。在渲染中,中間的圖像使用4萬個油彩,當視點停止移動時,就變成了右圖,使用了60萬個油彩(此圖由Szymon Rusinkiewicz的QSPlat program產生,Lucy的模型來自斯坦福圖形實驗室)




Reference


[1] Bittner J, Wimmer M, Piringer H, et al.Coherent hierarchical culling: Hardware occlusion queries madeuseful[C]//Computer Graphics Forum. Blackwell Publishing, Inc, 2004, 23(3): 615-624.

[2] Zhang H, Manocha D, Hudson T, et al. Visibility cullingusing hierarchical occlusion maps[C]//Proceedings of the 24th annual conferenceon Computer graphics and interactive techniques. ACM Press/Addison-WesleyPublishing Co., 1997: 77-88.

[3] 實時計算機圖形學第二版[J]. 2004.

[4] Wonka P, Wimmer M, Schmalstieg D. Visibility preprocessing with occluder fusion for urban walkthroughs[M]//RenderingTechniques 2000. Springer, Vienna, 2000: 71-82.

[5] http://thomasdiewald.com/blog/?p=1488

[6] http://blog.csdn.net/skybreaker/article/details/1828104

[7] https://en.wikipedia.org/wiki/Bounding_volume_hierarchy

[8] Wonka P, Wimmer M, Sillion F X. Instantvisibility[C]//Computer Graphics Forum. Blackwell Publishers Ltd, 2001, 20(3):411-421.

[9] Wonka, Peter, Occlusion Culling for Real-Time Renderingof Urban Environments,Ph.D. Thesis, The Institute of Computer Graphics andAlgorithms, Vienna University of Technology, June, 2001. Cited on p. 679

[10] http://insaneguy.me/attachments/spatial_ds--bsp_tree-octree-kd-tree.pdf

[11] http://book.51cto.com/art/201008/220506.htm

[12] http://blog.csdn.net/silangquan/article/details/17386353

[13] Akeley, K., and T. Jermoluk, “High-Performance Polygon Rendering,”Computer Graphics (SIGGRAPH ’88 Proceedings), pp. 239–246, August 1988. Cited on p.22

[14] Akeley, K., P. Haeberli, and D. Burns, tomesh.c, a C-program on the SGI Developer’s Toolbox CD, 1990.Cited on p. 543, 553, 554

[15] Akeley, Kurt, “Reality EngineGraphics,” Computer Graphics (SIGGRAPH 93 Proceedings),pp. 109–116, August 1993. Cited on p. 126



The end.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章