【GPU精粹與Shader編程】(七) 一篇文章帶你讀完《GPU Gems 3》

 

        本文由@淺墨_毛星雲 出品,首發於知乎專欄,轉載請註明出處  

        文章鏈接: https://zhuanlan.zhihu.com/p/44671434

本文是【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》全書核心章節的思維導圖:

 

另外值得注意的幾點是:

  • 《GPU Gems 3》出版於2007年8月12日,全書共1008頁,41章。
  • 《GPU Gems 3》的英文原版已經由NVIDIA開源: https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_pref01.html
  • 本文對《GPU Gems 3》全書渲染相關的前28章進行了盤點、提煉與總結。
  • 本文正文可以作爲一個文字版的索引,方便後續通過此文,對《GPU Gems 3》一書的內容進行快速分類檢索與對應章節的深入閱讀與研究。

OK,下面開始正文。

 

全文內容總覽

 

本文總結的《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)

 

 

第一部分 幾何體(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上關於程序化地形和植被生成的分享:

這邊是《幽靈行動:荒野》在GDC 2017程序化地形技術演示視頻:

https://www.youtube.com/watch?v=JIQ_YVwUONA

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

https://www.youtube.com/watch?v=t258ePDlxtQ

 

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

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

圖 《幽靈行動:荒野》中程序化地形的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年提出來的一種體素級重建方法。MarchingCubes算法也被稱爲“等值面提取”(Isosurface Extraction)算法。

下圖闡述了應用Marching Cube算法的一些基本案例

圖 Marching Cubes算法的14種基本案例(而其他的240種案例僅僅是這些紀元案例的旋轉或翻轉的結果)

首先,將世界劃分成無限數目的等大小立方體塊。在世界空間座標系中,每個立方塊的大小爲1 x 1 x 1。然而,每個塊中有32^3個體素可能含有多邊形。爲當前視錐可視的地形塊動態劃分一個含有大約300個頂點緩衝區的內存池,較近的塊具有較高的優先權。隨着用戶的移動,當有新的地形塊進入視錐時,視錐中被裁掉的最遠或最近的頂點緩衝區便被回收,以被新的塊使用。

而對每一幀的渲染思路方面,文中的思路是,根據位置從前到後對所有的頂點緩衝區進行排序(它們的包圍盒已知)。然後生成所有需要的立方體塊,剔除最遠距離的塊。最終,按照從前到後的順序繪製各個塊,以免在被遮擋的塊上進行像素着色時浪費大量的時間。

本章英文原書全文傳送門:

https://developer.nvidia.com/gpugems/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/gpugems/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/gpugems/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/gpugems/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/gpugems/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的運動合成方法的實現。

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

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

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

圖6-8爲每個分支合成角運動(Angular Motion)

圖 DirectX 10下的GPU管線

本章英文原書全文傳送門:

https://developer.nvidia.com/gpugems/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的基於點的隱式表面可視化,在保持互動級幀速率的情況下渲染變形球。

該方法由三部分組成:計算受限速度、斥力及粒子密度,來實現接近一致的粒子分佈。

需要注意的是,該方法並不是採用步進立方體(Marching Cubes)算法來生成多邊形列表,而是通過將自由移動的粒子約束到這個表面來對元球的隱式表面進行採樣。其的目標是通過渲染數千個粒子將元球可視化爲光滑表面,每個粒子覆蓋一個微小的表面區域。

爲了在GPU上成功應用這種基於點的技術,文中解決了三個基本問題。首先,需要評估元球的隱式函數及其每個渲染粒子的梯度,以便將粒子約束到曲面。爲此,文章設計了一種新穎的數據結構,用於快速評估片段着色器中的隱式函數。其次,需要將顆粒均勻地分佈在表面上。對此,文章提出了一種快速方法,用於在每個粒子上執行最近鄰搜索,在GPU上進行兩次渲染傳遞。該方法用於根據平滑粒子流體動力學方法計算排斥力。第三,爲了進一步加速顆粒分散,文中也提出了一種將顆粒從高密度區域轉移到表面上的低密度區域的方法。

圖 CPU上執行的流體模擬循環以及在GPU上執行的流體可視化循環

圖 排斥(Repulsion)算法

圖 逐粒子光照、帶有紋理和混合的流表面。 左圖爲無重力環境中的圓塊狀對象,右圖爲杯子中的水

本章英文原書全文傳送門:

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch07.html

 

第二部分 光照和陰影(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)是計算沒有鋸齒現象的柔和陰影的理想算法。

圖8-10樣本數據和相關的區域求和表

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

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

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

本章英文原書全文傳送門:

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch08.html

 

第9章 使用全局光照交互電影級重光照(Interactive Cinematic Relighting with Global Illumination)

【關鍵詞】

  • 全局光照(Global Illumination)

  • 重光照(Relighting)

  • 間接光照(indirect illumination)

  • 壓縮稀疏矩陣(Packing Sparse Matrix Data)

【內容盤點】

這章中介紹了用於電影級光照設計的GPU重光照(Relighting)引擎。該方法對傳統的幀緩存方法進行了擴展,支持多次反射的間接光照,可應用於具有高几何複雜性、光澤材質和使用程序化着色器所得到的靈活的直接光照模型的場景。

圖 文中的重光照算法架構

以下是文中重光照算法的完整僞代碼:

Texture computeLighting(light, viewSamples, gatherSamples)
{

    // Direct illumination on view and gather samples
    viewDirect = computeDirectIllumination(light, viewSamples);
    gatherDirect = computeDirectIllumination(light, gatherSamples);

    // Multibounce indirect illumination on gather samples
    gatherDirectWavelet = waveletTransform(gatherDirect);
    gatherIndirect =sparseMultiply(multiBounceWaveletMatrix, gatherDirectWavelet);
    gatherFull = gatherDirect + gatherIndirect;

    // Final bounce from gather to view samples
    gatherFullWavelet = waveletTransform(gatherFull);
    viewIndirect =sparseMultiply(finalGatherWaveletMatrix, gatherFullWavelet);

    // Combine into final image.
    viewFull = viewDirect + viewIndirect;

    return viewFull;

}

圖 該文中介紹的系統中使用點光源燈和聚光燈渲染的場景

本章英文原書全文傳送門:

https://developer.nvidia.com/gpugems/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/gpugems/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/gpugems/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/gpugems/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/gpugems/GPUGems3/gpugems3_ch13.html

 

第三部分 渲染(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的渲染結果,但其生成所需的時間要少許多】

另外,關於實時皮膚渲染技術總結,可以參考本系列文章中的上一篇文章:《:真實感皮膚渲染技術總結》https://zhuanlan.zhihu.com/p/42433792

本章英文原書全文傳送門: https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch14.html

 

第15章 可播放的全方位動作捕捉(Playable Universal Capture)

【關鍵詞】

  • 全方位捕捉(Universal Capture)

  • 動作捕捉(Motion Capture)

  • 主成分分析(Principal Component Analysis, PCA)

  • 數據捕捉(Data Acquisition)

【內容盤點】

這章討論了一個全方位捕捉(Universal Capture)的實時實現方法,用於真實感人物角色的動作以及渲染,該方法從電影《黑客帝國》中改進而來。此方法基於對變動漫反射紋理貼圖的PCA壓縮以及GPU解壓縮。而紋理貼圖通過當時最先進的臉部特徵捕捉系統得到。而結果已經通過測試並應用到高質量的實時原型系統,以及遊戲開發中。

圖15-11幀解壓縮(Frame Decompression Algorithm)算法的圖示

圖 三個攝像機視圖中的圖像

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

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

圖 E3 2006 Tigger Woods遊戲demo中,伍茲標誌性的笑容的出色捕捉復現

本章英文原書全文傳送門:

https://developer.nvidia.com/gpugems/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/gpugems/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/gpugems/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/gpugems/GPUGems3/gpugems3_ch18.html

 

第19章 《Tabula Rasa》中的延遲着色(Deferred Shading in Tabula Rasa)

【關鍵詞】

  • 延遲着色(Deferred Shading)

  • 前向着色(Forward Shading)

  • 體積光(Light Volumes)

  • 可讀深度(Readable Depth)

  • 法線緩存(Normal Buffer)

  • 雙向光照(Bidirectional Lighting)

  • 球體映射(Globe Mapping)

  • 盒式光照(Box Lights)

  • 陰影貼圖(Shadow Maps)

  • 高效光照體(Efficient Light Volumes)

  • 模板掩碼(Stencil Masking)

  • 動態分支(Dynamic Branching)

【內容盤點】

圖《Tabula Rasa》封面圖

這章內容關於延遲着色,承接了《GPU Gem2》中的《S.T.A.L.K.E.R中的延遲着色》一文,是對其內容的延伸。相較於《S.T.A.L.K.E.R中的延遲着色》,這章着重於介紹基於延遲渲染的引擎中所需要的高層次問題、技術以及解決方法。

文中提到延遲着色的主要缺點包括:

  • 高內存帶寬的使用

  • 沒有硬件抗鋸齒

  • 缺乏合適的對透明度混合的支持。

而延遲着色的主要有點包括:

  • 光照計算的消耗與場景複雜度無關

  • 着色器能夠對深度及其他像素信息進行訪問

  • 每個像素僅被每個光照亮一次。即,若像素後來被其他不透明幾何體所遮擋,其上便不會有光照計算。

  • 清晰分佈的着色器代碼:材質渲染從光照計算中分開

該章中講到了一些可以在前向或者延遲着色引擎中實現的高級光照特性,包括雙向光照(Bidirectional Lighting)、球體映射(Globe Mapping),盒式光照(Box Lights)、陰影貼圖(Shadow Maps)等技術。

延遲渲染的優化方面,講到了高效光照體積(Efficient Light Volumes)、模板掩碼(Stencil Masking)以及動態分支(Dynamic Branching)等內容。

本章英文原書全文傳送門:

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch19.html

 

第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/gpugems/GPUGems3/gpugems3_ch20.html

 

第四部分 圖像效果(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/gpugems/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/gpugems/GPUGems3/gpugems3_ch22.html

 

第23章 高速的離屏粒子(High-Speed, Off-Screen Particles)

【關鍵詞】

  • 粒子系統(Particle System)

  • 離屏粒子(Off-Screen Particle)

  • 深度降採樣(Downsampling Depth)

【內容盤點】

粒子效果在遊戲中隨處可見,大量粒子系統普遍用於煙、火、爆炸、沙塵、和霧。然而若這些粒子填滿了屏幕,過度繪製(overdraw)可能幾乎會達到無限,並且通常會導致幀速率問題。

文章提出的解決方案是,將昂貴的粒子渲染到離屏(off-screen)的渲染目標中,而這個渲染目標的大小是幀緩衝區大小的一小部分。這可以在過度繪製(overdraw)中產生巨大的開銷節省,但是會犧牲一些圖像處理的開銷。

而結果顯示,低分辨率的離屏渲染可以帶來巨大的性能提升,它有助於使粒子系統耗費更加可控,因此幀速率並不會在過度繪製的最壞的情況下成爲性能問題。

圖 基本離屏算法的步驟【(a)僅固體對象 (b)僅在低分辨率、離屏渲染對象中的粒子 (c)結合後的場景】

本章英文原書全文傳送門:

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch23.html

 

第24章 保持線性的重要性(The Importance of Being Linear)

【關鍵詞】

  • 顏色空間(Color Space)

  • 線性空間(Linear Space)

  • 伽馬空間(Gamma Space)

  • 伽馬校正(Gamma Correction)

【內容盤點】

這章講到,OpenGL、DirectX以及任何我們書寫的着色器,會將所有的紋理輸入、光照/材質交互,以及輸出當做線性(即、光照強度和,漫反射乘積)來執行數學運算。但假如我們的紋理輸入是非線性的,並且用戶使用了未校準及未修正的顯示器來應用非線性顏色空間變換。而這樣會導致各種形式的失真和不精確等問題(如mipmap過濾錯誤)以及一些粗糙錯誤(如及不正確的光照漸變)。而適當的gamma修正可能是最簡單,花費最小,也是最廣泛使用的技術。而爲了讓讀者規避這些問題,文中給出了一系列的解決方法與建議。

值得一提的是,目前流行的基於物理的渲染若要得到正確精準的渲染結果,正是需要在線性空間下進行。

圖 顯示器的典型響應曲線

圖 使用合適的gamma校正(左側)及不進行gamma校正的渲染(右側)圖

本章英文原書全文傳送門:

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch24.html

 

第25章 在GPU 上渲染矢量圖(Rendering Vector Art on the GPU)

【關鍵詞】

  • 矢量(Vector)

  • 二次條樣(Quadratic Splines)

  • 三次貝塞爾曲線(cubic Bezier curves)

【內容盤點】

矢量(Vector)表示爲指定形狀的一種分辨率無關的方法,其具有任意大小,可以對內容進行顯示而不需要細化(tessellation)以及沒有采樣失真的優點。

這章給出了一個算法,用於渲染由封閉路徑所定義的向量圖形,而封閉路徑可以包含二次樣條(Quadratic Splines)或三次貝塞爾曲線(cubic Bézier curves)。

圖 所有參數立方平面曲線可歸類爲此三種曲線類型之一的某些段的參數化

圖 渲染二次樣條曲線

圖 渲染三次樣條【(a)有向的多輪廓三次樣條輸入、(b)每個貝塞爾凹包被局部地三角化;內側區域被全局地三角化;(c)內部三角形被填充,曲線段使用一個特殊的像素着色器程序渲染】

本章英文原書全文傳送門:

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch25.html

 

第26章 通過顏色進行對象探測:使用 GPU 進行實時視頻圖像處理(Object Detection by Color: Using the GPU for Real-Time Video Image Processing)

【關鍵詞】

  • 對象探測(Object Detection)

  • 圖像處理(Image Processing)

【內容盤點】

嚴格意義上並非遊戲開發相關,略。

本章英文全文鏈接:

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch26.html

 

第27章 後處理效果:運動模糊(Motion Blur as a Post-Processing Effect)

【關鍵詞】

  • 運動模糊(Motion Blur)

  • 後處理(Post-Processing Effect)

【內容盤點】

在視頻遊戲中,模擬速度最好的方法之一便是使用運動模糊(Motion Blur)。這章中闡述了一種使用在深度緩存中的深度值來計算對象世界空間位置的以實現運動模糊的方法,該方法可以作爲一個基礎方法使用,並且可以很輕易地整合到遊戲引擎中,同時提供了比傳統的多路徑方法更高的性能。

圖 不具有運動模糊的場景

圖 使用了運動模糊的場景

圖 有無運動模糊的對比

圖 《神祕海域4》中的運動模糊

本章英文原書全文傳送門:

https://developer.nvidia.com/gpugems/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/gpugems/GPUGems3/gpugems3_ch28.html

 

【GPU精粹三部曲】 Part I • 完結

這篇文章至此,GPU精粹三部曲中《GPU Gems》、《GPU Gems 2》、《GPU Gems3》組成的第一部曲,也就告一段落了。

 

通過【GPU精粹與Shader編程】系列的這前7篇文章,我們已經將這三本書中的重點內容,全都過了一遍。希望各位讀者能因此有所收穫。

下篇文章,將開啓全新的《GPU Pro》系列。

再會。

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