一篇文章帶你讀完《GPU Gems 3》
本文是【GPU精粹與Shader程式設計】系列的第七篇文章。文章盤點、提煉和總結了《GPU Gems 3》全書總計28章的核心內容。
同時這篇文章,也是【GPU精粹與Shader程式設計】系列文章對GPU精粹三部曲中《GPU Gems》、《GPU Gems 2》、《GPU Gems 3》組成的第一部曲的完結篇。下篇文章,將開啟全新的《GPU Pro》系列。
《GPU Gems 3》全書核心框架脈絡思維導圖
首先,放出經過總結的,《GPU Gems 3》全書核心章節的思維導圖:

PS:原圖解析度很大,網頁端可能顯示並不清晰,建議將原圖另存為本地圖片後檢視
另外值得注意的幾點是:
- 《GPU Gems 3》出版於2007年8月12日,全書共1008頁,41章。
- 《GPU Gems 3》的英文原版已經由NVIDIA開源: https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_pref01.html
- 本文對《GPU Gems 3》全書渲染相關的前28章進行了盤點、提煉與總結。
- 本文正文可以作為一個文字版的索引,方便後續通過此文,對《GPU Gems 3》一書的內容進行快速分類檢索與對應章節的深入閱讀與研究。
全文內容總覽
本文總結的《GPU Gems 3》中這28章,分別為:
第一部分 幾何體(Geometry)
- 第1章 使用GPU 生成複雜的程式化地形(Generating Complex Procedural Terrains Using the GPU)
- 第2章 群體動畫渲染(Animated Crowd Rendering)
- 第3章 DirectX 10 中的混合形狀(DirectX 10 Blend Shapes: Breaking the Limits)
- 第4章 下一代SpeedTree 渲染(Next-Generation SpeedTree Rendering)
- 第5章 通用自適應網格細化(Generic Adaptive Mesh Refinement)
- 第6章 對樹的GPU 生成程式式風動畫(GPU-Generated Procedural Wind Animations for Trees)
- 第7章 GPU 上基於點的變形球視覺化(Point-Based Visualization of Metaballs on a GPU)
第二部分 光照和陰影(Light and Shadows)
- 第8章 區域求和的差值陰影貼圖(Summed-Area Variance Shadow Maps)
- 第9章 使用全域性光照互動電影級重光照(Interactive Cinematic Relighting with Global Illumination)
- 第10章 在可程式設計GPU 上實現並行分割陰影貼圖(Parallel-Split Shadow Maps on Programmable GPUs)
- 第11章 基於層次化的遮擋剔除和幾何著色器的高效魯棒陰影體(Efficient and Robust Shadow Volumes Using Hierarchical Occlusion Culling and Geometry Shaders)
- 第12章 高質量的環境光遮蔽(High-Quality Ambient Occlusion)
- 第13章 後處理特效:體積光散射(Volumetric Light Scattering as a Post-Process)
第三部分 渲染(Rendering)
- 第14章 用於真實感實時面板渲染的高階技術(Advanced Techniques for Realistic Real-Time Skin Rendering)
- 第15章 可播放的全方位動作捕捉(Playable Universal Capture)
- 第16章 Crysis 中植被的程式化動畫和著色(Vegetation Procedural Animation and Shading in Crysis)
- 第17章 魯棒的多鏡面反射和折射(Robust Multiple Specular Reflections and Refractions)
- 第18章 用於浮雕對映的鬆散式錐形步進(Relaxed Cone Stepping for Relief Mapping)
- 第19章 《Tabula Rasa》中的延遲著色(Deferred Shading in Tabula Rasa)
- 第20章 基於GPU的重要性取樣(GPU-Based Importance Sampling)
第四部分 影象效果(Image Effects)
- 第21章 真實Impostor(True Impostors)
- 第22章 在GPU上烘焙法線貼圖(Baking Normal Maps on the GPU)
- 第23章 高速的離屏粒子(High-Speed, Off-Screen Particles)
- 第24章 保持線性的重要性(The Importance of Being Linear)
- 第25章 在GPU 上渲染向量圖(Rendering Vector Art on the GPU)
- 第26章 通過顏色進行物件探測:使用 GPU 進行實時視訊影象處理(Object Detection by Color: Using the GPU for Real-Time Video Image Processing)
- 第27章 後處理效果:運動模糊(Motion Blur as a Post-Processing Effect)
- 第28章 實用景深後期處理(Practical Post-Process Depth of Field)
OK,下面開始正文。
I、第一部分 幾何體(Geometry)
第1章 使用GPU 生成複雜的程式化地形(Generating Complex Procedural Terrains Using the GPU)
【關鍵詞】
- 程式化地形(Procedural Terrains)
- MC(Marching Cubes)演算法
- 密度函式(Density Function)
- 地形生成(Terrain Generation)
【內容盤點】
作為《GPU精粹3》的開篇章節,這章給出了一個使用GPU在互動速率下生成複雜程式化三維地形的方法。同樣也展示瞭如何對地形進行紋理對映和著色、如何為地形建立LOD的方案。
閱讀這一章時讓我想起了近年兩款大作《地平線:黎明》和《幽靈行動:荒野》在GDC 2017上關於程式化地形和植被生成的分享(以後有空,計劃會專門對這一系列內容做一個專題):
- GPU-Based Procedural Placement in Horizon Zero Dawn,GDC 2017
- Ghost Recon Wildlands: Terrain Tools and Technology,GDC 2017
這邊是《幽靈行動:荒野》在GDC 2017程式化地形技術演示視訊:

而這邊是《地平線:黎明》中Decima Engine程式化地形和植被生成的演示視訊:


圖《地平線:黎明》的地形和植被程式化生成

圖《地平線:黎明》的地形和植被程式化生成

圖 《幽靈行動:荒野》中程式化地形的11+種生物群系和140+種地表材質

圖 《幽靈行動:荒野》的 32k x 32k x 4 layer的程式化地形大世界,讓其成為了育碧至今地形最大的開放世界遊戲

圖 《幽靈行動:荒野》中基於程式化地形的16平方公里的湖面,河流和溪流面積

圖 《幽靈行動:荒野》中基於程式化地形的超過600公里的道路
OK,回到本章內容中來。
傳統上,程式化地形(Procedural Terrains)受限於CPU生成的,且用GPU進行渲染的高度場(Height Fields)。然而,生成複雜地形是一項高度並行化的任務,CPU的序列處理本質上不適合完成這項工作。此外,CPU生成高度場的方法也無法很好地提供吸引人的地形特徵(如凹洞和凸起物)。為了互動級的幀率下生成高度複雜的程式化地形,文中使用GPU和來進行此項工作。
理論上,地形表面可以用單個函式完整地進行描述,這個函式被稱為密度函式(Density Function)。

圖 一個已知8個稜角密度(Density)值的體素(黑點指示了稜角處的正密度值,每個稜角為一個“位(byte)”,用於在總共8位的情況中進行判斷)
使用GPU來生成地形塊所需要的多邊形,這個塊進行進而被細分成 32 x 32 x 32的小單元,即體素(Voxel)。Marching Cubes演算法允許我們在一個單獨的體素中生成正確的多邊形。MarchingCubes(簡稱MC)演算法是面繪製演算法中的經典演算法,它是W.Lorensen等人於1987年提出來的一種體素級重建方法。Marching Cubes演算法也被稱為“等值面提取”(Isosurface Extraction)演算法。
下圖闡述了應用Marching Cube演算法的一些基本案例。

圖 Marching Cubes演算法的14種基本案例(而其他的240種案例僅僅是這些紀元案例的旋轉或翻轉的結果)
首先,將世界劃分成無限數目的等大小立方體塊。在世界空間座標系中,每個立方塊的大小為1 x 1 x 1。然而,每個塊中有32^3個體素可能含有多邊形。為當前視錐可視的地形塊動態劃分一個含有大約300個頂點緩衝區的記憶體池,較近的塊具有較高的優先權。隨著使用者的移動,當有新的地形塊進入視錐時,視錐中被裁掉的最遠或最近的頂點緩衝區便被回收,以被新的塊使用。
而對每一幀的渲染思路方面,文中的思路是,根據位置從前到後對所有的頂點緩衝區進行排序(它們的包圍盒已知)。然後生成所有需要的立方體塊,剔除最遠距離的塊。最終,按照從前到後的順序繪製各個塊,以免在被遮擋的塊上進行畫素著色時浪費大量的時間。
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch01.html
第2章 群體動畫渲染(Animated Crowd Rendering)
【關鍵詞】
- 群體動畫渲染(Animated Crowd Rendering)
- 蒙皮例項化(Skinned Instancing)
- 效能優化(Performance Optimization)
- Draw Call降低(Reduce Draw Call)
【內容盤點】
使用例項化(instancing)方法,可以通過減少Draw Call、狀態更改以及緩衝區更新的數量來減少CPU的開銷。
這章中展示瞭如何使用頂點紋理存取的DirectX 10例項化來實現基於硬體調色盤的蒙皮角色(skinned characters)。這個demo同時使用了常量緩衝區和系統變數SV_InstanceID來有效實現這項技術。在Intel Core 2 Duo GeForce 8800 GTX顯示卡上,能夠實現大約1萬個人物擁有不同的動畫和蒙皮。

圖 動畫人群的特寫鏡頭

圖 使用Skinned例項化的群體動畫
蒙皮例項化(Skinned instancing)這項技術適用於實時地渲染數量龐大且彼此獨立的動畫人物。它使用頂點紋理存取來讀取儲存在單一紋理中的動畫資料,也使用了SV_InstanceID來索引包含了示例資料的常量緩衝區(位置和動畫時間)。而配合一個簡單易行的LOD系統,能在合適距離上有更高的多邊形/光照細節。

圖 Instancing Basics

圖 LOD資料的佈局
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch02.html
第3章 DirectX 10 中的混合形狀(DirectX 10 Blend Shapes: Breaking the Limits)
【關鍵詞】
- 混合形狀(blend shapes)
- 流輸出方法(Stream-Out Method)
- 緩衝區-模板方法(Buffer-Template Method)
【內容盤點】
本章中,作者展示了流輸出方法(Stream-Out Method)和緩衝區-模板方法(Buffer-Template Method)兩種方法,來突破之前基於GPU加速的混合形狀的應用限制。

圖 Little Vampire blendshapes @ Artstation by Jimmy Levinsky

圖 Dawn Demo中擁有50多個混合形狀的角色
上圖是基於上述兩種方案在模型Dawn的臉上組合出了54種面部表情的Demo。
其中,流輸出方法(Stream-Out Method)可以打破DirectX 10中屬性個數限制,思路是使用迭代的方式來操作網格。通過在每個pass中組織當前活動混合形狀的子集(subset),只需每個pass中少量的屬性。

圖 一次僅使用全部混合形狀的一個子集
而緩衝區-模板方法(Buffer-Template Method)的思路是使用GPU來實現遍歷(與流輸出方法類似)。DirectX 10通過在頂點著色器中提供流控制來管理遍歷,並提供了將緩衝區與著色器資源檢視相繫結以存取資料的能力,進而使得GPU遍歷成為可能。

圖 使用迴圈來減少API呼叫
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch03.html
第4章 下一代SpeedTree 渲染(Next-Generation SpeedTree Rendering)
【關鍵詞】
- SpeedTree
- 植物渲染(Vegatable Rendering)
- 輪廓裁剪(Silhouette Clipping)
- 樹葉光照(Leaf Lighting)
- 半透明覆蓋演算法(Alpha to Coverage)
【內容盤點】
眾所周知,SpeedTree是Interactive Data Visualization, Inc.(IDV)公司出品的用來實時渲染樹木的中介軟體。

圖 SpeedTree效果圖 @ARK

圖 SpeedTree示例

圖 SpeedTree示例
文章提到,使用了SpeedTree的遊戲可以對渲染方式進行更為靈活的選擇。在本章中,使用了當時較新的顯示卡GeForce 8800的幾個特性為SpeedTree生成下一代高質量的擴充套件。首先,輪廓剪下增加了樹枝和樹幹外形的細節。其次,陰影貼圖提供了逐樹葉級的真實感自我遮擋。除此之外,我們進一步使用了雙頁面光照模型和高動態範圍渲染來優化光照。最後,多重取樣和抗鋸齒和半透明覆蓋(alpha to coverage)提供了非常高的視覺質量,避免了鋸齒的失真。
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch04.html
第5章 通用自適應網格細化(Generic Adaptive Mesh Refinement)
【關鍵詞】
- 自適應網格優化(Adaptive Mesh Refinement)
- 自適應優化模型(Adaptive Refinement Patterns,ARP)
- 深度標籤(Depth-Tagging)
【內容盤點】
這章給出了一個單通道的、具有普通適性的頂點程式,以對任意拓撲形狀的網路進行動態的自適應優化。

圖 文中的通用自適應網格細化的工作流架構
從靜態或動態的粗網格開始,該頂點程式用儲存在GPU儲存器中的一組預鑲嵌圖案中的細化三角形補丁(refined triangular patch)替換每個三角形,所述三角形補丁根據所需的區域性幾何細化量來選擇。
通過在引數空間中對這些模式進行編碼,這種一對多(one-to-many),即時的(on-the-fly)三角形替換被轉換為頂點位移函式的簡單重心插值,其可以由使用者提供,也可以在現有的資料基礎上進行計算。除了頂點位移之外,在細化過程中還可以使用相同的過程來插值任何其他每頂點屬性。
該方法在某種意義上是完全通用的,即對網格拓撲,位移函式或細化級別沒有任何限制。

圖 自適應細化的模式

圖 通過深度標記控制自適應GPU細化
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch05.html
第6章 對於樹的GPU 生成程式式風動畫(GPU-Generated Procedural Wind Animations for Trees)
【關鍵詞】
- 程式式風動畫(Procedural Wind Animations)
- 樹木動畫渲染(Rendering Tree Animation)
- 噪聲(Noise)
- 風場(Wind Field)
【內容盤點】
這章描述了一個程式式的方法,可以生成真實受風場影響的樹木動畫。該方法的主要目標是實現具有大量植被的大型開放環境的模擬和視覺化。
具體而言,這是一種在受到諸如風場等外力影響的情況下合成樹木運動的方案,基於將樹木運動建模為隨機過程(stochastic processes)等方法,並通過新增簡單規則對其進行擴充套件,同時模擬樹枝行為中的空氣動力學特性。文中還提供了基於GPU的流體模擬與文中方法相結合的方案,以改善對風的真實感的模擬。文中還給出了在GPU上進行運動合成的詳細說明,以及基於DirectX 9和DirectX 10的運動合成方法的實現。

圖 由三層節點深層結構表示的樹結構

圖 用於驅動樹幹動畫的噪聲函式

圖 影響給定頂點的分支索引列表,其儲存在頂點屬性中

圖 為每個分支合成角運動(Angular Motion)

圖 DirectX 10下的GPU管線
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch06.html
第7章 GPU 上基於點的變形球視覺化(Point-Based Visualization of Metaballs on a GPU)
【關鍵詞】
- 元球/變形球(metaball)
- 表面粒子(Surface Particles)
- 區域性粒子斥力(Local Particle Repulsion)
- 雜湊表(Hash Table)
- 限制粒子(Constraining Particles)
【內容盤點】
變形球(metaball),又常譯作元球,是計算機圖形學中的 n 維物體。變形球渲染技術最初由 Jim Blinn 於1980年代初提出。

圖 兩個變形球的融合
這章給出了一種在GPU上以互動式速率渲染變形球的方法,其有效且高效地在GPU上實現了Withkin and Heckbert 1994的基於點的隱式表面視覺化,在保持互動級幀速率的情況下渲染變形球。
該方法由三部分組成:計算受限速度、斥力及粒子密度,來實現接近一致的粒子分佈。

圖 CPU上執行的流體模擬迴圈以及在GPU上執行的流體視覺化迴圈

圖 排斥(Repulsion)演算法

圖 逐粒子光照、帶有紋理和混合的流表面。 左圖為無重力環境中的圓塊狀物件,右圖為杯子中的水
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch07.html
II、第二部分 光照和陰影(Light and Shadows)
第8章 區域求和的差值陰影貼圖(Summed-Area Variance Shadow Maps)
【關鍵詞】
- 差值陰影貼圖(Variance Shadow Maps)
- 區域求和差值陰影貼圖(Summed-Area Variance Shadow Maps,SAVSM)
- 百分比臨近過濾(Percentage-Closer Filtering)
【內容盤點】
這章主要討論了陰影貼圖過濾和柔和陰影,回顧了差值陰影貼圖演算法,並解釋瞭如何用它來解決很多常見的陰影貼圖問題(如縮變鋸齒、偏移及軟陰影)。同時還介紹了一種簡單且有效的技術,該技術能夠顯著減少差值陰影貼圖(Variance Shadow Maps,VSM)中的light-bleeding失真。最後,文章介紹了一種基於差值陰影貼圖(Variance Shadow Maps,VSM)和區域求和表(Summed-Area Tables,SAT)的實時陰影演算法。
對任意的方波過濾器區域,該演算法都能有效地計算出陰影權值,最終文章得出結論,區域求和的差值陰影貼圖(Summed-Area Variance Shadow Mapping ,SAVSM)是計算沒有鋸齒現象的柔和陰影的理想演算法。

圖 樣本資料和相關的區域求和表

圖 區域求和的基於差值陰影貼圖(Summed-Area Variance Shadow Mapping ,SAVSM)演算法渲染的硬邊和軟邊陰影

圖 文中基於區域求和的差值陰影貼圖技術渲染出的效果圖

圖 文中基於區域求和的差值陰影貼圖技術渲染出的效果圖
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch08.html
第9章 使用全域性光照互動電影級重光照(Interactive Cinematic Relighting with Global Illumination)
【關鍵詞】
- 全域性光照(Global Illumination)
- 重光照(Relighting)
- 間接光照(indirect illumination)
- 壓縮稀疏矩陣(Packing Sparse Matrix Data)
【內容盤點】
這章中介紹了用於電影級光照設計的GPU重光照(Relighting)引擎。該方法對傳統的幀快取方法進行了擴充套件,支援多次反射的間接光照,可應用於具有高几何複雜性、光澤材質和使用程式化著色器所得到的靈活的直接光照模型的場景。

圖 文中的重光照演算法架構

圖 該文中介紹的系統中使用點光源燈和聚光燈渲染的場景
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch09.html
第10章 在可程式設計GPU 上實現並行分割陰影貼圖(Parallel-Split Shadow Maps on Programmable GPUs)
【關鍵詞】
- 並行分割陰影貼圖(Parallel-split shadow maps,PSSMs)
- 陰影貼圖(Shadow Maps)
- 多陰影貼圖(Multiple Shadow Maps)
- 幾何著色器克隆(Geometry Shader Cloning)
【內容盤點】
本章提出了一種高階陰影貼圖技術——“並行分割陰影貼圖(Parallel-Split Shadow Maps,PSSMs)”,可以在大型環境中提供抗鋸齒和實時的光影效果,文章同樣展示了在目前的可程式設計GPU中這種技術的實現細節,提供了多種實現方式。
在此技術中,視錐體使用平行於投影面積的多個剪輯平面被分割成多個深度層,並且每個層會被一個獨立的陰影貼圖所渲染。如下圖所示。
該演算法主要步驟有:
- 步驟1:分割視錐體(Splitting the View Frustum)
- 步驟2:計算光的變換矩陣(Calculating Light's Transformation Matrices)
- 步驟3和4:產生PSSMs和綜合陰影(Generating PSSMs and Synthesizing Shadows)

圖 PSSMs對三個特定於硬體實現的渲染管線的視覺化

圖 並行分割的陰影貼圖在Dawnspire:Prelude遊戲中的應用

圖 SSM和Multipass PSSM的比較

圖 渲染陰影貼圖基於幾何著色器克隆(Geometry Shader Cloning)的GPU渲染管道
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch10.html
第11章 基於層次化的遮擋剔除和幾何著色器的高效魯棒陰影體(Efficient and Robust Shadow Volumes Using Hierarchical Occlusion Culling and Geometry Shaders)
【關鍵詞】
- 陰影體(Shadow Volumes)
- 層次化的遮擋剔除(Hierarchical Occlusion Culling)
- 幾何著色器(Geometry Shaders)
【內容盤點】
這章通過使用非常規的生成陰影幾何體的方法,實現了一種非常魯棒的陰影體渲染技術,該技術對於複雜的網格模型同樣有效。通過結合層次硬體遮擋查詢(hierarchical hardware occlusion)和幾何著色器,文章同樣在那些之前使用模板陰影效果不太好的場景中達到了很高的效能。該方法的實現主要包括,針對低質量網路的魯棒陰影,使用幾何體著色器動態生成陰影體,使用層次化遮擋裁剪提高效能,三個部分。

圖 使用動態陰影體方法生成的實時渲染效果
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch11.html
第12章 高質量的環境光遮蔽(High-Quality Ambient Occlusion)
【關鍵詞】
- 環境光遮蔽(Ambient Occlusion)
- 平滑處理不連續(Smoothing Discontinuities)
- 波形因子(form factor)
【內容盤點】
Buuel在2005年提出了一種新技術來對環境光遮蔽進行近似,所採用的方法是將遮蔽整合到自適應對模型層次的遍歷過程中。這種技術在模擬光滑變動的陰影方面效果很好,但對於輸入模型,在高質量的應用方面不夠魯棒。
本章對該方法進行了闡述,並在實踐中進行了改進,使其更實用,對更普遍的模型的更加魯棒。思路方面,保持演算法的基本骨架不變 -該章節內容自適應地對儲存在樹中的粗遮擋解決方案中的遮擋進行求和,而一些關鍵變化顯著提高了結果的穩健性,最終得到了令人信服的光滑的軟陰影,以及具有真實感的多樣區域性細節。而改進思路方面,可分為,對不連續處進行平滑滑處理(Smoothing Discontinuities),和移除尖點並加入細節(Removing Pinches and Adding Detail)兩部分。

圖 不連續處的平滑處理:過渡區的幾何

圖 移除尖點並加入細節:將三角形剪下為可見的四邊形

圖 本章演算法實現的汽車模型中環境光遮蔽的比較【左上:應用於逐頂點的原始演算法;左下:應用於逐片段的原始演算法;右上:應用於平面法線(flat normals)的新演算法;右下:應用於光滑著色法線的新演算法】
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch12.html
第13章 後處理特效:體積光散射(Volumetric Light Scattering as a Post-Process)
【關鍵詞】
- 體積光散射(Volumetric Light Scattering)
- 後處理(Post-Process)
- 雲隙光(Crepuscular Rays)
- 螢幕空間遮蔽(Screen-Space Occlusion)
【內容盤點】
本章中提出了一種簡單的後處理方法,該方法可以產生由於大氣中陰影引起的體積光散射效果。我們對已有的日光散射(daylight scattering)的分析模型進行了改進,將體遮擋效果包含在內,並且給出了其在畫素著色器中的實現方法。
內容方面,包括雲隙光(Crepuscular Rays)、體積光散射(Volumetric Light Scattering)、後處理畫素著色器(Post-Process Pixel Shader)、螢幕空間遮蔽方法(Screen-Space Occlusion Methods)幾部分。

圖 螢幕空間中的光線投射

圖 基於本章實現的實時動畫場景中的體積光散射
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch13.html
III、第三部分 渲染(Rendering)
第14章 用於真實感實時面板渲染的高階技術(Advanced Techniques for Realistic Real-Time Skin Rendering)
【關鍵詞】
- 面板渲染(Skin Rendering)
- 次表面散射(Subsurface Scattering)
- 紋理空間漫反射(Texture-Space Diffusion)
- Bloom過濾器(Bloom Filter)
【內容盤點】
這章是《GPU Gems 3》中的核心章節,《GPU Gems 3》書的封面即是選取的本章的渲染效果圖。自其問世以來,就成為了面板渲染領域經常會被參考到的文章,可謂面板渲染技術的集大成者,奠基之作。
內容方面,文章從面板外觀開始,總結出實時面板渲染系統由兩個分量組成:
- 鏡面反射分量(specular reflection component)
- 次表面散射分量(subsurface scattering component)
文中詳細描述了這兩個分量的GPU實現,包括漫散射(diffuse scattering)理論的回顧和漫散射擴散剖面(diffuse scattering profiles)的新公式的呈現。

圖 多層面板模型
散射理論(Scattering Theory)方面,文章首先講到了擴散剖面(diffusion profile)的概念,然後是高斯和的擴散剖面(A Sum-of-Gaussians Diffusion Profile),以及適於面板的高斯和(A Sum-of-Gaussians Fit for Skin)。
高階次表面散射(Advanced Subsurface Scattering)方面,文章講到了紋理空間漫反射(texture-space diffusion)[Borshukov and Lewis 2003]
通過改進透射陰影貼圖(ranslucent shadow maps)[Dachsbacher and Stamminger 2004]來計算穿過表面的深度,並將陰影區域連線到面向光的表面上的位置,完成穿過如耳朵類似表面區域的透射(Transmission)效果。

圖 一個實時的面板渲染結果【這幅影象十分接近Donnerand Jesen 2005的渲染結果,但其生成所需的時間要少許多】
另外,關於實時面板渲染技術總結,可以參考本系列文章中的上一篇文章:《:真實感面板渲染技術總結》
毛星雲:《GPU Gems 3》:真實感面板渲染技術總結本章英文原書全文傳送門: https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch14.html
第15章 可播放的全方位動作捕捉(Playable Universal Capture)
【關鍵詞】
- 全方位捕捉(Universal Capture)
- 動作捕捉(Motion Capture)
- 主成分分析(Principal Component Analysis, PCA)
- 資料捕捉(Data Acquisition)
【內容盤點】
這章討論了一個全方位捕捉(Universal Capture)的實時實現方法,用於真實感人物角色的動作以及渲染,該方法從電影《黑客帝國》中改進而來。此方法基於對變動漫反射紋理貼圖的PCA壓縮以及GPU解壓縮。而紋理貼圖通過當時最先進的臉部特徵捕捉系統得到。而結果已經通過測試並應用到高質量的實時原型系統,以及遊戲開發中。

圖 幀解壓縮(Frame Decompression Algorithm)演算法的圖示

圖 三個攝像機檢視中的影象

圖 未最終渲染得到的“Leanne”角色

圖 經過最終渲染得到的“Leanne”角色

圖 E3 2006 Tigger Woods遊戲demo中,伍茲標誌性的笑容的出色捕捉復現
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch15.html
第16章 Crysis 中植被的程式化動畫和著色(Vegetation Procedural Animation and Shading in Crysis)
【關鍵詞】
- 植被過程化動畫(Vegetation Procedural Animation)
- 植被著色(Vegetation Shading)
- 孤島危機(Crysis)
- Cry Engine 2
【內容盤點】
這章闡述瞭如何以高效且具有真實感的方法處理著色和程式化植被動畫。主要介紹了《孤島危機(Crysis)》中植被的渲染以及程式化動畫如何實現(基於Cry ENGINE 2)。本章中給出的程式化動畫技術使用普通的方式實現,因此將風力實現於非植被物件(如衣服和頭髮)也是有可能的;唯一不同之處在於這些情況下不需要使用主彎曲(main bending)。文中的方法實現了直升機、手雷爆炸、武器火力對植被、衣服和頭髮的影響,在這些實現中均使用了極為高效的方法。
內容方面,分為程式化動畫(Procedural Animation)和植被著色(Vegetation Shading)兩部分。

圖 頂點色的使用

圖 次表面紋理貼圖

圖 邊緣平滑

圖 最終渲染結果【左:沒有使用動態範圍、陰影和後處理的結果;右:使用了所有技術的結果】
不得不說的是,2007年11月面世的《孤島危機(Crysis)》,已經過了10週歲,其渲染效果放到今天,依然很能打:

圖 植被渲染效果圖 @Crysis @2007

圖 植被渲染效果圖 @Crysis @2007

圖 植被渲染效果圖 @Crysis @2007
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch16.html
第17章 魯棒的多鏡面反射和折射(Robust Multiple Specular Reflections and Refractions)
【關鍵詞】
- 多鏡面反射(Multiple Specular Reflections)
- 多折射(Multiple Refractions)
- 層次化距離圖(Layered Distance Maps)
【內容盤點】
本章中,給出了一個魯棒的演算法來計算GPU中的單個和多個反射和折射。
為了使片段著色器能夠在查詢輔助光線的交點時訪問整個場景的幾何描述,文中首先將場景渲染為層次化距離圖(layer distance map)。

圖 具有3 + 1層的分層距離圖

圖 以方位來追蹤射線
每個層在紋理記憶體中被儲存為一個立方體貼圖(cube map)。演算法基於搜尋來輔助光線追蹤。搜尋過程從光線遍歷開始,這樣保證不會漏掉任何光線與螢幕的交點,繼而進行割線搜尋(secant serch)以保證精確性。
相比於直接實現經典的光線跟蹤方法,使用光柵化的幾何體表示中跟蹤光線方法的一個重要優點,是這些方法可以被整合到當前的遊戲引擎中,可以利用遊戲開發中的可見性演算法,並使用當時最新顯示卡的全部潛能。

圖 茶壺單次和多次反射的結果。【圖(a)最多一次反射,50/100 FPS 圖(b) 最多兩次反射36/80 FPS,(c)最多三次反射 30/60 FPS】
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch17.html
第18章 用於浮雕對映的鬆散式錐形步進(Relaxed Cone Stepping for Relief Mapping)
【關鍵詞】
- 浮雕對映(Relief Mapping)
- 鬆散式錐形步進(Relaxed Cone Stepping)
- 錐形步進對映(Cone step mapping ,CSM)
【內容盤點】
本章中,描述了一個用於逐片段的置換對映的新的光線場相交(ray-height-field intersection)策略,其結合了錐形步進對映和二分查詢兩者的優點。
文章將這種新的空間跳躍(space-leaping)演算法命名為鬆散式錐形步進(Relaxed Cone Stepping, RCS),這是由於其消除了在錐形步進對映(Cone step mapping ,CSM)中對錐形半徑定義的限制。而光場相交的思想是使用一個一個改進的space-leaping技術替代線性查詢,其後立刻接一個二分查詢。

圖 錐形步進對映(Cone step mapping ,CSM)

圖 不同深度和tiling因子對外觀的影響的圖示
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch18.html
第19章 《Tabula Rasa》中的延遲著色(Deferred Shading in Tabula Rasa)
知乎專欄字數限制原因,導致這部分需省略,原內容可以跳轉到GitHub檢視:
QianMo/Game-Programmer-Study-Notes第20章 基於GPU的重要性取樣(GPU-Based Importance Sampling)
【關鍵詞】
- 渲染方程(Rendering Formulation)
- 基於GPU的重要性取樣(GPU-Based Importance Sampling)
- 蒙特卡洛積分(Monte Carlo quadrature)
- 擬隨機低差異序列(Quasirandom Low-Discrepancy Sequences)
- mipmap
【內容盤點】
高動態範圍(High-Dynamic-Range ,HDR),結合環境貼圖預過濾技術(Environment map prefiltering techniques)(Kautz et al. 2000),以及結合使用小波(wavelets)(Wang et al. 2006)或球面調和函式(spherical harmonics)(Ramamoorthi and Hanrahan 2002)的頻空間解決方案,為實時視覺化提供了方案。然而,這種方式過於呆板,因為需要大量的預計算或繁多的程式碼用於光滑表面反射。
這章給出了上述方案的一種替代技術——基於GPU的重要性取樣(GPU-Based Importance Sampling),該技術基於蒙特卡羅積分對光滑物件使用基於影象的光照,採用該技術僅需要很少的預計算,並在單個GPU著色器中運算。因此合適於幾乎所有需要實時動態改變材質或光照的管線。

圖 每畫素40個樣本的重要性取樣

圖 過濾重要性取樣示意圖

圖 對斯坦福兔子使用逐畫素40次取樣的實時渲染效果。

圖 空間變化的BRDF(Spatially Varying BRDF)設計器
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch20.html
IV、第四部分 影象效果(Image Effects)
第21章 真實Impostor(True Impostors)
【關鍵詞】
- Billboard
- impostor
- 半透明impostor (Translucence impostor)
【內容盤點】
這章給出了 “真實impostor(ture imposters)”方法,這是一種向任意場景中加入大量簡單模型而不需要渲染大量多邊形的方法。這種方法使用了現代著色硬體來執行光線發射到已定義的紋理體積中,且表示非高度場表面資料的多深度層與四邊形相關。
如同傳統的imposter方法,ture imposter方法將四邊形沿其中心渲染使其總是朝向攝像機。而與傳統的顯示靜態紋理的imposter技術不同,真實imposter技術使用畫素著色器發射一個觀察光線穿過四邊形的紋理座標空間,與3D模型相交併計算相交點處的顏色。而紋理座標空間通過一個以四邊形中心為原點的框架定義。

圖 生成公告板

圖 真實imposter投影的多邊形

圖 投射檢視光線拍攝2D切片

圖 基於射線步進(Ray March)和二分搜尋確定體積交點
真imposter支援模型上的自陰影、反射以及折射,是一個查詢體積間距離的有效方法。且文中基於相交測試的擴充套件,也對半透明效果進行了支援。

圖 擴充套件相交測試以支援半透明
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch21.html
第22章 在GPU上烘焙法線貼圖(Baking Normal Maps on the GPU)
【關鍵詞】
- 法線貼圖烘焙(Baking Normal Maps)
- 均勻網格(Uniform Grid)
【內容盤點】
這章分析了傳統的基於光線投射的法線貼圖投影技術如何在GPU上成功地實現,還闡述了一些其中普遍存在的問題,例如,記憶體限制和反走樣。
而對文中實現的技術進行一些微小的改動,就可以生成位移貼圖(displacement mapping),以及視差貼圖(parallax mapping)和浮雕貼圖(relief mapping)。而使用更加複雜的著色器,還可以生成區域性環境光遮蔽(local ambient occlusion)或腔貼圖(cavity maps)。且這種技術的一個優點是可以足夠快遞顯式地單獨渲染所有mip等級。

圖 對映到GPU的資料的視覺化表示

圖 最終在GPU上生成的法線貼圖及其對應模型
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch22.html
第23章 高速的離屏粒子(High-Speed, Off-Screen Particles)
知乎專欄字數限制原因,導致這部分需省略,原內容可以跳轉到GitHub檢視:
QianMo/Game-Programmer-Study-Notes第24章 保持線性的重要性(The Importance of Being Linear)
【關鍵詞】
- 顏色空間(Color Space)
- 線性空間(Linear Space)
- 伽馬空間(Gamma Space)
- 伽馬校正(Gamma Correction)
【內容盤點】
這章講到,OpenGL、DirectX以及任何我們書寫的著色器,會將所有的紋理輸入、光照/材質互動,以及輸出當做線性(即、光照強度和,漫反射乘積)來執行數學運算。但假如我們的紋理輸入是非線性的,並且使用者使用了未校準及未修正的顯示器來應用非線性顏色空間變換。而這樣會導致各種形式的失真和不精確等問題(如mipmap過濾錯誤)以及一些粗糙錯誤(如及不正確的光照漸變)。而適當的gamma修正可能是最簡單,花費最小,也是最廣泛使用的技術。而為了讓讀者規避這些問題,文中給出了一系列的解決方法與建議。
值得一提的是,目前流行的基於物理的渲染若要得到正確精準的渲染結果,正是需要線上性空間下進行。

圖 顯示器的典型響應曲線

圖 使用合適的gamma校正(左側)及不進行gamma校正的渲染(右側)圖
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch24.html
第25章 在GPU 上渲染向量圖(Rendering Vector Art on the GPU)
知乎專欄字數限制原因,導致這部分需省略,原內容可以跳轉到GitHub檢視:
QianMo/Game-Programmer-Study-NotesPS:第26章嚴格意義上並非遊戲開發相關,同略。
第27章 後處理效果:運動模糊(Motion Blur as a Post-Processing Effect)
【關鍵詞】
- 運動模糊(Motion Blur)
- 後處理(Post-Processing Effect)
【內容盤點】
在視訊遊戲中,模擬速度最好的方法之一便是使用運動模糊(Motion Blur)。這章中闡述了一種使用在深度快取中的深度值來計算物件世界空間位置的以實現運動模糊的方法,該方法可以作為一個基礎方法使用,並且可以很輕易地整合到遊戲引擎中,同時提供了比傳統的多路徑方法更高的效能。

圖 不具有運動模糊的場景

圖 使用了運動模糊的場景

圖 有無運動模糊的對比

圖 《神祕海域4》中的運動模糊
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch27.html
第28章 實用景深後期處理(Practical Post-Process Depth of Field)
【關鍵詞】
- 景深(Depth of Field,DoF)
- 後處理(Post-Processing Effect)
【內容盤點】
景深(Depth of field,DOF),也叫焦點範圍(focus range)或有效焦距範圍(effective focus),是指場景中最近和最遠的物體之間出現的可接受的清晰影象的距離。
這章中闡述了一個景深(Depth of Field,DoF)演算法,該演算法主要適合於FPS遊戲,最初使用於《使命召喚:現代戰爭》中。完整的演算法包含以下4個階段:
1、對前進物件的散光圈進行降取樣。
2、模糊臨近的散光圈影象。
3、通過模糊後和未模糊的影象計算實際前景散光圈。
4、在一個最後的全屏處理路徑中使用可變寬度模糊,並在其中應用前景和背景散光圈影象。
幾張帶景深的渲染效果,取最近幾年的一些引擎和遊戲截圖。

圖 CryEngine3 中有無景深的渲染對比(無景深)

圖 CryEngine3 中有無景深的渲染對比(有景深)

圖 《地平線:黎明》中的景深
本章英文原書全文傳送門:
https:// developer.nvidia.com/gp ugems/GPUGems3/gpugems3_ch28.html
本文的GitHub版
不少朋友們喜歡看GitHub版本的文章,我也很喜歡。
首先,MarkDown可以很方便地插入快捷導航目錄,能進行瞬間跳轉到指定子章節。其次,GitHub版本的文章中沒有單篇文章的字數限制,少了很多篇幅方面的桎梏。而且因為Git的便利性,版本管理的優勢,最新的勘誤和修訂,以及新文章的更新,第一時間會在GitHub的Repo中進行。
【本文的GitHub版本傳送門】:
QianMo/Game-Programmer-Study-Notes【GPU精粹三部曲】 Part I • 完結
這篇文章至此,GPU精粹三部曲中《GPU Gems》、《GPU Gems 2》、《GPU Gems3》組成的第一部曲,也就告一段落了。

通過【GPU精粹與Shader程式設計】系列的這前7篇文章,我們已經將這三本書中的重點內容,全都過了一遍。希望大家能因此有所收穫。
下篇文章,將開啟全新的《GPU Pro》系列。
再會。