【GPU精粹與Shader程式設計】(七) 一篇文章讀完《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》全書核心章節的思維導圖:
另外值得注意的幾點是:
- 《GPU Gems 3》出版於2007年8月12日,全書共1008頁,41章。
- 本文對《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程式化地形技術演示視訊:
而這邊是《地平線:黎明》中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年提出來的一種體素級重建方法。MarchingCubes演算法也被稱為“等值面提取”(Isosurface Extraction)演算法。
下圖闡述了應用Marching Cube演算法的一些基本案例
圖 Marching Cubes演算法的14種基本案例(而其他的240種案例僅僅是這些紀元案例的旋轉或翻轉的結果)
首先,將世界劃分成無限數目的等大小立方體塊。在世界空間座標系中,每個立方塊的大小為1 x 1 x 1。然而,每個塊中有32^3個體素可能含有多邊形。為當前視錐可視的地形塊動態劃分一個含有大約300個頂點緩衝區的記憶體池,較近的塊具有較高的優先權。隨著使用者的移動,當有新的地形塊進入視錐時,視錐中被裁掉的最遠或最近的頂點緩衝區便被回收,以被新的塊使用。
而對每一幀的渲染思路方面,文中的思路是,根據位置從前到後對所有的頂點緩衝區進行排序(它們的包圍盒已知)。然後生成所有需要的立方體塊,剔除最遠距離的塊。最終,按照從前到後的順序繪製各個塊,以免在被遮擋的塊上進行畫素著色時浪費大量的時間。
本章英文原書全文傳送門:
第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資料的佈局
本章英文原書全文傳送門:
第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 [email protected] 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呼叫
本章英文原書全文傳送門:
第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)提供了非常高的視覺質量,避免了鋸齒的失真。
本章英文原書全文傳送門:
第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細化
本章英文原書全文傳送門:
第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管線
本章英文原書全文傳送門:
第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)演算法
圖 逐粒子光照、帶有紋理和混合的流表面。 左圖為無重力環境中的圓塊狀物件,右圖為杯子中的水
本章英文原書全文傳送門:
第二部分 光照和陰影(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)演算法渲染的硬邊和軟邊陰影
圖 文中基於區域求和的差值陰影貼圖技術渲染出的效果圖
圖 文中基於區域求和的差值陰影貼圖技術渲染出的效果圖
本章英文原書全文傳送門:
第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;
}
圖 該文中介紹的系統中使用點光源燈和聚光燈渲染的場景
本章英文原書全文傳送門:
第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渲染管道
本章英文原書全文傳送門:
第11章 基於層次化的遮擋剔除和幾何著色器的高效魯棒陰影體(Efficient and Robust Shadow Volumes Using Hierarchical Occlusion Culling and Geometry Shaders)
【關鍵詞】
-
陰影體(Shadow Volumes)
-
層次化的遮擋剔除(Hierarchical Occlusion Culling)
-
幾何著色器(Geometry Shaders)
【內容盤點】
這章通過使用非常規的生成陰影幾何體的方法,實現了一種非常魯棒的陰影體渲染技術,該技術對於複雜的網格模型同樣有效。通過結合層次硬體遮擋查詢(hierarchical hardware occlusion)和幾何著色器,文章同樣在那些之前使用模板陰影效果不太好的場景中達到了很高的效能。該方法的實現主要包括,針對低質量網路的魯棒陰影,使用幾何體著色器動態生成陰影體,使用層次化遮擋裁剪提高效能,三個部分。
圖 使用動態陰影體方法生成的實時渲染效果
本章英文原書全文傳送門:
第12章 高質量的環境光遮蔽(High-Quality Ambient Occlusion)
【關鍵詞】
-
環境光遮蔽(Ambient Occlusion)
-
平滑處理不連續(Smoothing Discontinuities)
-
波形因子(form factor)
【內容盤點】
Buuel在2005年提出了一種新技術來對環境光遮蔽進行近似,所採用的方法是將遮蔽整合到自適應對模型層次的遍歷過程中。這種技術在模擬光滑變動的陰影方面效果很好,但對於輸入模型,在高質量的應用方面不夠魯棒。
本章對該方法進行了闡述,並在實踐中進行了改進,使其更實用,對更普遍的模型的更加魯棒。思路方面,保持演算法的基本骨架不變 -該章節內容自適應地對儲存在樹中的粗遮擋解決方案中的遮擋進行求和,而一些關鍵變化顯著提高了結果的穩健性,最終得到了令人信服的光滑的軟陰影,以及具有真實感的多樣區域性細節。而改進思路方面,可分為,對不連續處進行平滑滑處理(Smoothing Discontinuities),和移除尖點並加入細節(Removing Pinches and Adding Detail)兩部分。
圖 不連續處的平滑處理:過渡區的幾何
圖 移除尖點並加入細節:將三角形剪下為可見的四邊形
圖 本章演算法實現的汽車模型中環境光遮蔽的比較【左上:應用於逐頂點的原始演算法;左下:應用於逐片段的原始演算法;右上:應用於平面法線(flat normals)的新演算法;右下:應用於光滑著色法線的新演算法】
本章英文原書全文傳送門:
第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)幾部分。
圖 螢幕空間中的光線投射
圖 基於本章實現的實時動畫場景中的體積光散射
本章英文原書全文傳送門:
第三部分 渲染(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的渲染結果,但其生成所需的時間要少許多】
第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中,伍茲標誌性的笑容的出色捕捉復現
本章英文原書全文傳送門:
第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
本章英文原書全文傳送門:
第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】
本章英文原書全文傳送門:
第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因子對外觀的影響的圖示
本章英文原書全文傳送門:
第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)等內容。
本章英文原書全文傳送門:
第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)設計器
本章英文原書全文傳送門:
第四部分 影象效果(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支援模型上的自陰影、反射以及折射,是一個查詢體積間距離的有效方法。且文中基於相交測試的擴充套件,也對半透明效果進行了支援。
圖 擴充套件相交測試以支援半透明
本章英文原書全文傳送門:
第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上生成的法線貼圖及其對應模型
本章英文原書全文傳送門:
第23章 高速的離屏粒子(High-Speed, Off-Screen Particles)
【關鍵詞】
-
粒子系統(Particle System)
-
離屏粒子(Off-Screen Particle)
-
深度降取樣(Downsampling Depth)
【內容盤點】
粒子效果在遊戲中隨處可見,大量粒子系統普遍用於煙、火、爆炸、沙塵、和霧。然而若這些粒子填滿了螢幕,過度繪製(overdraw)可能幾乎會達到無限,並且通常會導致幀速率問題。
文章提出的解決方案是,將昂貴的粒子渲染到離屏(off-screen)的渲染目標中,而這個渲染目標的大小是幀緩衝區大小的一小部分。這可以在過度繪製(overdraw)中產生巨大的開銷節省,但是會犧牲一些影象處理的開銷。
而結果顯示,低解析度的離屏渲染可以帶來巨大的效能提升,它有助於使粒子系統耗費更加可控,因此幀速率並不會在過度繪製的最壞的情況下成為效能問題。
圖 基本離屏演算法的步驟【(a)僅固體物件 (b)僅在低解析度、離屏渲染物件中的粒子 (c)結合後的場景】
本章英文原書全文傳送門:
第24章 保持線性的重要性(The Importance of Being Linear)
【關鍵詞】
-
顏色空間(Color Space)
-
線性空間(Linear Space)
-
伽馬空間(Gamma Space)
-
伽馬校正(Gamma Correction)
【內容盤點】
這章講到,OpenGL、DirectX以及任何我們書寫的著色器,會將所有的紋理輸入、光照/材質互動,以及輸出當做線性(即、光照強度和,漫反射乘積)來執行數學運算。但假如我們的紋理輸入是非線性的,並且使用者使用了未校準及未修正的顯示器來應用非線性顏色空間變換。而這樣會導致各種形式的失真和不精確等問題(如mipmap過濾錯誤)以及一些粗糙錯誤(如及不正確的光照漸變)。而適當的gamma修正可能是最簡單,花費最小,也是最廣泛使用的技術。而為了讓讀者規避這些問題,文中給出了一系列的解決方法與建議。
值得一提的是,目前流行的基於物理的渲染若要得到正確精準的渲染結果,正是需要線上性空間下進行。
圖 顯示器的典型響應曲線
圖 使用合適的gamma校正(左側)及不進行gamma校正的渲染(右側)圖
本章英文原書全文傳送門:
第25章 在GPU 上渲染向量圖(Rendering Vector Art on the GPU)
【關鍵詞】
-
向量(Vector)
-
二次條樣(Quadratic Splines)
-
三次貝塞爾曲線(cubic Bezier curves)
【內容盤點】
向量(Vector)表示為指定形狀的一種解析度無關的方法,其具有任意大小,可以對內容進行顯示而不需要細化(tessellation)以及沒有采樣失真的優點。
這章給出了一個演算法,用於渲染由封閉路徑所定義的向量圖形,而封閉路徑可以包含二次樣條(Quadratic Splines)或三次貝塞爾曲線(cubic Bézier curves)。
圖 所有引數立方平面曲線可歸類為此三種曲線型別之一的某些段的引數化
圖 渲染二次樣條曲線
相關推薦
【GPU精粹與Shader程式設計】(七) 一篇文章讀完《GPU Gems 3》
本文由@淺墨_毛星雲 出品,首發於知乎專欄,轉載請註明出處 本文是【GPU精粹與Shader程式設計】系列的第七篇文章。文章盤點、提煉和總結了《GPU Gems 3》全書總計28章的核心內容。 同時這篇文章,也是【GPU精粹與Shader程
【GPU精粹與Shader程式設計】(四) 《GPU Gems 2》全書核心內容提煉總結 · 上篇
毛星雲,網路ID「淺墨」,90後,熱愛遊戲開發、遊戲引擎、計算機圖形、實時渲染等技術,就職於騰訊互娛。 微軟最有價值專家 著作《Windows遊戲程式設計之從零開始》、《OpenCV3程式設計入門》 碩士就讀於南京航空航天大學航天學院(2013級碩士研究生),已於2016年三月畢業。本科
【GPU精粹與Shader程式設計】(一) 開篇 & 全系列11本書核心知識點總覽
系列文章前言 《GPU Gems》1~3 、《GPU Pro》1~7 以及《GEM Zen》組成的GPU精粹系列書籍,是遊戲開發、計算機圖形學和渲染領域的業界大牛們優秀經驗的分享合輯彙編,是江湖各大武林門派絕學經典招式的精華薈萃,可謂遊戲開發、圖形學和渲染領
【GPU精粹與Shader程式設計】(八) 《GPU Pro 1》全書核心內容提煉總結
本文由@淺墨_毛星雲 出品,首發於知乎專欄,轉載請註明出處 本文是【GPU精粹與Shader程式設計】系列的第八篇文章,全文共兩萬餘字。文章盤點、提煉和總結了《GPU Pro 1》全書總計22章的核心內容。 題圖來自《荒野大鏢客2》。
【GPU精粹與Shader程式設計】(二) 《GPU Gems 1》全書核心內容提煉總結 · 上篇
本文由出品,首發於知乎專欄,轉載請註明出處 題圖背景來自《戰神4》。 系列文章前言 我們知道,《GPU Gems》1~3 、《GPU Pro》1~7 以及《GPU
【GPU精粹與Shader程式設計】(三) 《GPU Gems 1》全書核心內容提煉總結 · 下篇
本文由出品,首發於知乎專欄,轉載請註明出處 題圖背景來自《神祕海域4》。系列文章前言《GPU Gems》1~3 、《GPU Pro》1~7 以及《GPU Zen》組成的饕餮盛宴,共11本書,合稱“GPU精粹三部曲“,是遊戲開發、計算機圖形學和渲染領域的業界頂尖大牛們一線經驗的
【GPU精粹與Shader程式設計】(五) 《GPU Gems 2》全書核心內容提煉總結 · 下篇
本文由@淺墨_毛星雲 出品,首發於知乎專欄,轉載請註明出處 本文核心內容為《GPU Gems 2》中講到的真實感水體渲染,以及真實感頭髮渲染、通用的折射模擬、改進的Perlin噪聲等次核心內容。
【GPU精粹與Shader程式設計】(六) 《GPU Gems 3》:真實感面板渲染技術總結
本文由@淺墨_毛星雲 出品,首發於知乎專欄,轉載請註明出處 本文是【GPU精粹與Shader程式設計】系列的第六篇文章。 《GPU Gems 3》中的“Chapter 14. Advanced Techniques for Reali
【圖形學與遊戲程式設計】開發筆記-入門篇3:d3d,opengl以及GPU
首先是遊戲程式為什麼需要單獨的運算器。大家如果學過演算法的話,應該都聽聞過時間複雜度這個東西,也就是O(n),O(n^2) 這些,那麼接下來我們大致的估算一下一個遊戲每秒需要運算的n的次數。首先我們將遊戲的演算法分為三種,其一是幾何體級別的演算法,n的次數與之前我們說的幾何體的頂點以及索引數量有關係,其二是光
【淺墨Unity3D Shader程式設計】之五 聖誕夜篇: Unity中Shader的三種形態對比&混合操作合輯
本系列文章由出品,轉載請註明出處。 QQ交流群:330595914 本文算是固定功能Shader的最後一篇,下一次更新應該就會開始講解表面Shader,而講解完表面Shader,後續文章最終會講解到頂點著色器和片段著色器(也就是可程式設計
【圖形學與遊戲程式設計】開發筆記-基礎篇4:程式方面的補充知識
(本系列文章由pancy12138編寫,轉載請註明出處:http://blog.csdn.net/pancy12138) 上一次的教程已經講到了圖形管線的實現過程,由於之前大部分篇幅都在進行理論方面的描述,所以這篇文章主要是補充一些前面教程沒有提到過的程式方面的知識介紹,其
【圖形學與遊戲程式設計】開發筆記-基礎篇2:DX11初始化
(本系列文章由pancy12138編寫,轉載請註明出處:http://blog.csdn.net/pancy12138) 這篇文章應該屬於開始程式設計的第一節了,這一節我們將要講解如何使用C++初始化directx,以及一些新的除錯技巧。因為windows程式框架相關的內
【圖形學與遊戲程式設計】開發筆記-入門篇3:圖形繪製
(本系列文章由pancy12138編寫,轉載請註明出處:http://blog.csdn.net/pancy12138) 這篇文章將會開始講解最基本的圖形繪製方法,也就是說。這一次的教程將為大家展示一個3D圖形是怎麼被一步步的處理並最終顯示出來的。當然,大家應該還記得入門篇
【圖形學與遊戲程式設計】開發筆記-基礎篇1:熟悉開發環境
OK,上面嘚吧嘚吧半天就是為了讓大家清楚的認識到什麼是.h,lib,dll以及這些東西的用處是神馬。因為大家不一定都是用vs來作為開發環境的,所以講的詳細一點讓大家更容易瞭解和使用。那麼接下來我們就得講重點了。也就是directx和opengl是怎麼配的。首先我們來談directx。注意有些人可能之前學過一些
【圖形學與遊戲程式設計】開發筆記-基礎篇6:緩衝區與混合
(本系列文章由pancy12138編寫,轉載請註明出處:http://blog.csdn.net/pancy12138) 上一次的教程大家瞭解了最簡單的著色方法,那麼這一節我們來講解一些與著色無關的渲染管線流程。雖然在上一次的教程中我們成功的展示瞭如何給一個球體的表面進行光
【搞定Java併發程式設計】第1篇:執行緒的五種可用狀態
本文轉載自牛客網上一網友的回答:概括的解釋下執行緒的幾種可用狀態 第一種狀態:新建(new):新建了一個執行緒物件。例如,Thread thread = new Thread(); 第二種狀態:可執行狀態(Runnable):又叫“就緒狀態”。執行緒新建後,其他執行緒(比如main執行
【搞定Java併發程式設計】第12篇:happens-before
上一篇:final域的記憶體語義:https://blog.csdn.net/pcwl1206/article/details/84925372 目 錄: 1、JMM的設計 2、happens-before的定義 3、happens-before規則
【搞定Java併發程式設計】第11篇:final域的記憶體語義
上一篇文章:鎖的記憶體語義:https://blog.csdn.net/pcwl1206/article/details/84921447 目 錄: 1、final域的重排序規則 2、寫final域的重排序規則 3、讀final域的重排序規則 4、final域為引用型
【搞定Java併發程式設計】第10篇:鎖的記憶體語義
上一篇:CAS詳解:https://blog.csdn.net/pcwl1206/article/details/84892287 目 錄: 1、鎖的釋放-獲取建立的happens-before關係 2、釋放鎖和獲取鎖的記憶體語義 3、鎖記憶體語義的實現 4、conc
【搞定Java併發程式設計】第9篇:CAS詳解
上一篇:volatile關鍵字詳解:https://blog.csdn.net/pcwl1206/article/details/84881395 目 錄: 一、CAS基本概念 1.1、CAS的定義 1.2、CAS的3個運算元 二、Java如何實現原子操作