GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖

遊資網發表於2019-07-22
六、實時輝光(Real-Time Glow)

【章節概覽】

這章講到2D光照效果中的輝光(Glow)和光暈(Halo),展示瞭如何通過影象處理方法完全地改善畫面及3D人物的渲染感官。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖遊戲中的Glow結合Bloom,得到出色的畫面效果

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖Unreal Engine的logo,即是採用了Glow效果

【核心內容提煉】

光源的輝光(Glow)和光暈(Halo)是自然界到處可見的現象,他們提供了亮度和氣氛強烈的視覺資訊。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖給強化後的武器加上Glow效果,該武器顯得更加強力 TERA

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖Glow效果在遊戲中的運用 Unreal Engine 4

在觀看計算機圖形、膠片和刷品時,到達眼睛的光強度是有限的,因此,辨別光源強度的唯一方法是通過它們周圍產生的輝光(Glow)和光暈(Halo),具體可以參考[Nakamae et al.1990]。這些輝光可以再現強烈光線的視覺效果,並使觀察者感知非常明亮的光源。即使物體周圍的微妙光暈也會讓人覺得它比沒有光輝的物體更亮。

在日常生活中,這些發光和光暈是由大氣中或我們眼中的光散射引起的(Spencer 1995)。使用現代圖形硬體,可以通過幾個簡單的渲染操作來再現這些效果。這使得我們可以使用明亮而有趣的物體來填滿實時渲染的場景,物體會顯得更為逼真或更具表現力,並且這是克服圖形渲染中傳統的低動態範圍圖形過於平庸的優雅手段之一。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖有輝光和沒有輝光的一個Tron 2.0中的角色對比

有幾種方法可以建立場景中的輝光。對於小的類似的點,可以把一個平滑的“輝光”紋理應用到公告牌幾何體上,而讓公告板幾何體在螢幕範圍內跟隨物體運動。

對於大的輝光源或複雜的輝光形狀,要建立輝光,最好對2D場景的渲染進行後處理。這章重點講到了後處理的實時輝光處理方法。如下圖。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖場景實時輝光的步驟(a)正常地渲染場景(b)塗抹所渲染的輝光源,以產生(c)中的一個輝光紋理,將其加到正常的場景畫面中,以產生(d)中最終的輝光效果。

渲染後處理輝光的步驟:

Step 1、輝光的指定和渲染(Specifying and Rendering the Sources of Glow)

Step 2、模糊輝光源(Blurring the Glow Sources)

Step 3、適配分步卷積(Adapting the Separable Convolution)

Step 4、在GPU上進行卷積(Convolution on the GPU)

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖有效地建立模糊的兩步分解法

上圖展示瞭如何有效地建立模糊的兩步分解法:首先,在一根軸上模糊於(a)中的輝光源的點,產生(b)中所示的中間結果,然後在另一個軸上模糊這個結果,產生顯示在(c)中的最終模糊。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖有輝光和無輝光的Tron 2.0中的英雄Jet

(a)用標準方法渲染3D模型(b)為一個由美術同學建立的輝光源紋理的渲染,目的是指定輝光面積的圖案和強度(c)為將輝光應用到標準的渲染結果後,得到的富有表現力的英雄角色效果。

另外,在輝光中使用的這個卷積和模糊方法還可以用於多種其他效果。它能用來計算景深效果的不同聚焦度,景深的資訊可以用來控制模糊度。它也能用來模糊投影的紋理陰影的邊緣,並且累積深度陰影對映的接近百分比過濾(percentage-closer filtering)結果。

而大面積的卷積能被應用於一個環境對映,以建立一個近似的輻照度對映,從而得到更逼真的場景照明(Ramamoorthi和Hanrahan 2001有相關論述)。用大面積的卷積也可以實現許多非真實感渲染技術和其他的特別效果。其中包括鍍著霜的玻璃、模擬衍射的透鏡搖曳,以及渲染皮膚時用的近似次表面散射。

大片的模糊和卷積能有效地在多種影象硬體上實時地計算,而處理和建立這些效果的程式碼可以容易地封裝成幾個C++類或一個小庫。

總之,螢幕輝光是一種很讚的效果,能夠容易地擴充套件到幾乎每一種情形,並且變化多端,通過其還夠延伸建立出很多其他的效果。最終的效果雖然細微但卻有張力,值得在各種遊戲中採用。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖 Glow效果在遊戲中的運用 Unreal Engine 4

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖 有了Glow效果的武器,會顯得更強力更炫酷

【核心要點總結】

渲染後處理輝光的步驟:

Step 1、輝光的指定和渲染(Specifying and Rendering the Sources of Glow)

Step 2、模糊輝光源(Blurring the Glow Sources)

Step 3、適配分步卷積(Adapting the Separable Convolution)

Step 4、在GPU上進行卷積(Convolution on the GPU)

【關鍵詞提煉】

實時輝光(Real-Time Glow)

光暈(Halo)

後處理(Post-Processing)

影象處理(Image Processing)

第二部分·次核心內容提煉總結

十六、使用遮擋區間對映產生模糊的陰影(Generating Soft Shadows Using Occlusion Interval Maps)

【章節概覽】

這章介紹了一種渲染軟陰影的技術,稱為遮擋區間對映(Occlusion Interval Maps),能夠正確地在靜態場景中渲染出光源沿著預定路徑移動時產生的模糊陰影。之所以叫遮擋區間對映,是因為此演算法使用紋理貼圖來儲存這種光源可見、而本身被遮擋的區間。

【核心要點】

對於需現實的加油站的Demo,文章一開始本打算使用一種預計算的可見度技術,例如球諧光照(Spherical Harmonic Lighting[Sloan et al.2002])來實現,但可惜的是無法達到目的,因為球諧光照適用的是非常低頻的光照,不適用於像太陽那樣小面積的光源。所以後來才開發出遮擋區間對映這種新的預計算可見度的技術,它能夠支援實時太陽照射的軟陰影。通過把問題簡化為在固定軌道上的線性光源來達到目的。

需要注意,遮擋區間對映(Occlusion IntervalMaps)技術有一些侷限性,只對沿固定軌道傳播的單條光線的靜態場景適用。這意味著它對人物和其他動態物體的陰影無效。但是其適用於靜態戶外場景中的陰影渲染。並且此技術因為遮擋區間對映對每個通道需要8位的進度,紋理壓縮將導致視覺效果失真。因此,必須禁用紋理壓縮,從而增加了紋理用量。

使用遮擋區間對映(Occlusion Interval Maps)技術,通過損失一定執行效能來獲得在靜態場景上實時執行的軟陰影演算法。遮擋區間對映(Occlusion Interval Maps)可以用作靜態光照貼圖的替代品,從而實現動態效果,可以得到從日出到日落光照明變化的動態效果。如下圖。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖 加油站入口

注意加油站牆上的陰影在圖形的左上方有清楚的邊界,但是它朝著右下方變得模糊而柔軟。這種相聯絡的清晰和模糊的變化是真實感軟陰影的重要性質,而這是由遮擋區間對映得到的。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖 汽車上方的木板在篷布上形成的陰影

上圖中汽車篷布上的木板形成了複雜的陰影。這對演算法來說是最壞的情況。這些木頭條使得篷布上的遮擋區間對映必須儲存在5個不同的紋理中,對於場景中的大多數物體,4個紋理就足以取得所有的陰影。

【關鍵詞提煉】

陰影渲染(Shadow Rendering)

軟陰影(Soft Shadows)

遮擋區間對映(Occlusion Interval Maps)

十七、透視陰影貼圖(Perspective Shadow Maps:Care and Feeding)

【章節概覽】

透視陰影貼圖(Perspective Shadow Maps,PSMs)是由Stamminger和Drettakis在SIGGRAPH 2002上提出的一種陰影貼圖(Shadow Maps)流派的方法。

透視投影貼圖方法的基本思想是,為了減少或消除陰影貼圖的失真走樣,對投射到大畫素區域的物體取最大的陰影貼圖紋素密度。

這章提出了一種優化透視陰影貼圖(Perspective Shadow Maps)方法的新思路,對其三種缺陷都一一進行了改進。

【核心要點】

這章首先講到動態陰影的建立,目前主要有兩個演算法流派:

•陰影體(shadow volumes)/模板陰影(stencil shadows)

•陰影貼圖(Shadow Maps)

陰影體和陰影貼圖演算法之間的不同之處在於,是涉及到物體空間(object space)還是影象空間(image space)。

•陰影體(Shadow Volumes)是物體空間(Object Space)的陰影演算法,通過建立表示陰影遮擋的多邊形結構來工作,這意味著我們始終具畫素精確但較“硬”的陰影。此方法無法處理沒有多邊形結構的物件,比如經過alpha測試修改的幾何圖形或經過位移對映的幾何體(displacement mapped geometry)。此外,繪製陰影體需要大量的填充率,這使得很難將它們用於密集場景中的每個物件上,特別是在存在多個燈光時。

•陰影貼圖(Shadow Maps)是影象空間(Image Space)的陰影演算法,它可以處理任何物體(如果能夠渲染一個物體,就能得到它的陰影),但是存在走樣(aliasing,鋸齒)的問題。走樣時常發生在有較寬或全方位光源的大場景中。問題在於陰影對映中使用的投影變換會改變陰影貼影象素的大小,因此攝像機附近的紋理畫素變得非常大。因此,我們必須使用巨大的陰影貼圖(四倍於螢幕解析度或更高)來實現更高的質量。儘管如此,陰影貼圖在複雜場景中卻比陰影體要快得多。

透視陰影貼圖(Perspective Shadow Maps,PSMs)是由Stamminger和Drettakis在SIGGRAPH 2002上提出的一種陰影貼圖(Shadow Maps)流派的方法,通過使用在投射後空間(post-projective space)中的陰影貼圖來去除其中的走樣,而在投射後空間中,所有近處的物體都比遠處的大。不幸的是,使用原始演算法很困難,因為只有要某些情況下才能正常工作。

以下是透視陰影對映演算法的三個主要問題和解決方案:

1、當光源在攝像機後面的時候,有一個虛擬的攝像機錐體。若在錐體內保持所有潛在的陰影投射體,陰影質量就會變得很差。

解決方案:是對光源矩陣使用特別的投射變換,因為投射後空間可以使用某些在通常空的世界空間中不能做的投射技巧。它使我們可以建立特殊的投射矩陣,可以看做“比無限遠更遠”。

2、光源在攝像機空間中的位置對陰影質量影響很大,對於垂直的方向光,完全沒有走樣問題,但是當光源朝向攝像機並迎面靠近它時,陰影對映走樣就很嚴重。

解決方案:把整個單位立方體保持在一個陰影貼圖紋理中,對於遇到的問題,有兩個辦法,每個辦法僅解決問題的一部分:單位立方體裁剪法,把光源攝像機對準單位立方體的必要部分;立方體對映法,使用多個紋理來儲存深度資訊。

3、最初的文章沒有討論過偏置(bias)問題。偏置是隨透視陰影貼圖而帶來的問題,因為紋素的面積以不均勻方式分佈,這意味著偏置不再是常量,而是與紋素的位置有關。

解決方案:使用在世界空間中的偏置(而且不再分析雙投射矩陣的結果),然後把這個世界空間偏置轉換到投射後空間。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖得到的陰影實時渲染結果(多邊形10w~50w個,解析度1600x1200)

【關鍵詞提煉】

陰影渲染(Shadow Rendering)

陰影貼圖(Shadow Maps)

透視陰影對映(Perspective Shadow Maps,PSMs)

緊鄰百分比過濾(percentage-closer filtering,PCF)

單位立方體裁剪法(Unit Cube Clipping)

十八、逐畫素光照的可見性管理(Managing Visibility for Per-Pixel Lighting)

【章節概覽】

這章講到了可見性在逐畫素渲染光照場景中的作用,也考慮如何使用可見性減少必須渲染的批次數量,從而改善效能。

【核心要點】

如下虛擬碼說明在一個場景中必須渲染的批次數:

  1. For each visible object

  2. For each pass in the ambient shader

  3. For each visible batch in the object

  4. Render batch

  5. For each visible light

  6. For each visible shadow caster

  7. For each pass in the shadow shader

  8. For each shadow batch in the object

  9. Render batch

  10. For each lit visible object

  11. For each pass in the light shader

  12. For each visible batch in the object

  13. Render batch
複製程式碼

正如虛擬碼所述,為了減少批次數,可以進行一些與非可見性相關的優化。最應該優化的是渲染每個光照所必須的通道數。批次數隨通道數線性增加,因此,我們應該最小化受限於CPU的遊戲通道數。

我們可以使用可見性來減少批數。其中,為了減少批次,各個部分(可見部分、光源部分、光照部分、陰影部分)的集合分開討論並生成。

可見性不僅能有效改善CPU的效能,也同樣可以改善GPU的效能。對模板體執行逐畫素光照時,填充率的消耗(模板體的填充或多次渲染大的物體)很快就變成了瓶頸,但可以使用剪下矩形(scissor rectangle)限制顯示卡渲染的面積,解決此問題。

逐畫素的照明需要大量的批次數和極高的填充率,所以要減少渲染的物體數和它們影響的螢幕面積。而使用這章中介紹的標準可見性演算法和技術,可以充分改善執行效能。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖不在可見集合中的物件可能會影響渲染場景

【關鍵詞提煉】

逐畫素光照(Per-Pixel Lighting)

可見性管理(Managing Visib1ility)

效能優化(Performance Optimization)

批次(Batch)

十九、空間BRDF(Spatial BRDFs)

【章節概覽】

這章主要先聊到了空間雙向反射分佈函式(SBRDF),接著文章討論了壓縮SBRDF表示式,以及由離散光或環境貼圖所照明的SBRDF的渲染方法。

【核心要點】

SBRDF是紋理貼圖和雙向反射分佈函式(BRDF)的組合。紋理貼圖儲存了反射或其他的屬性,它們沿著2D表面上的空間變化,而BRDF儲存的是表面上單個點的反射,包括從入射角到出射角的全部分佈。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖SBRDF的定義域

SBRDF對標準點光源或方向光源照明的SBRDF表面,文中直接貼圖了Shader原始碼,具體可以參考原文。

SBRDF除了可以用點光源或方向光源照明之外,還可以用環境貼圖中所有方向的入射光進行照明。關鍵是在渲染前用BRDF的一部分卷積環境貼圖。對於大多數的BRDF表示式,必須分別處理各個不同的BRDF。但因為一個SBRDF可能有上百萬個不同的BRDF,所以這樣做不可能。這篇文章採取的的做法是,簡單地用一個Phong葉片卷積環境貼圖,葉片可以選擇不同的鏡面指數,如n=0、1、4、16、64、256、這些貼圖能儲存在不同級別的立方體mipmap中。隨後,SBRDF紋素的n值就指細節層次(LOD),用於在立方體貼圖中取樣適當mipmap級別。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖用藍色的油漆和鋁BRDF得到的SBRDF渲染效果

【關鍵詞提煉】

雙向反射分佈函式(BRDF)

空間雙向反射分佈函式(SBRDF)

離散光(Discrete Lights)

環境貼圖(Environment Maps)

二十、基於影象的光照(Image-Based Lighting)

【章節概覽】

這篇文章打破了當時立方體貼圖環境(Cube-Map Environment)用法的桎梏,深入研究了更多可能的逼真光照效果。文章主要研究了基於影象的光照(Image-Based Lighting,IBL),包括區域性化的立方體對映,類似於使用基於影象的區域性光照(Localizing

Image-Based Lighting),然後介紹瞭如何把哪些重要的技巧用於著色模型,包括逼真的反射、陰影和漫反射/環境項。

【核心要點】

立方體貼圖通常用於建立無限遠環境的反射效果。但是使用少量Shader演算法,我們可以將物體放置在特定大小和位置的反射環境中,從而提供高質量的基於影象的光照(Image-Based

Lighting,IBL)。

在室內環境移動模型時,最好是使用近距離的立方體貼圖,距離的大小與當前的房間類似。當模型在房間移動時,根據模型在房間中的位置,適當地放大或縮小放射。這種方法得到的模擬效果使人感到更為可靠和逼真。尤其在包含窗戶,螢幕和其他可識別光源的環境中。而只要加入很少的Shader數學就能將反射區域性化。具體可以看原文貼出的Shader原始碼。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖不同位置上的區域性反射

另外,我們可以將3D幾何體做成立方體貼圖,並且在正常地渲染環境的時候,把貼圖應用到該環境的物體上。也可以使用貼圖作為環境,把它投射到較簡單的幾何體上。

立方體貼圖也能用來決定漫反射光照。Debevec的HDRShop程式能夠從對映立方體光照環境積分出全部的漫反射貢獻度,那麼通過把表面法線帶入預先卷積的立方體貼圖,能夠簡單地查詢漫反射貢獻。

基於影象的光照為複雜的光照計算提供了綜合而廉價的替代品,將一點數學加入紋理方法,可以大大拓寬“簡單”IBL效果,給3D影象提供更強的的方位感。

【關鍵詞提煉】

基於影象的光照(Image-Based Lighting,IBL)

立方體貼圖環境(Cube-Map Environment)

基於影象的區域性光照(Localizing Image-Based Lighting)

二十一、紋理爆炸(Texture Bombing)

【章節概覽】

這章介紹了紋理爆炸(Texture Bombing)和相關的細胞技術,它們能在Shader中增加視覺的豐富性,影象的多樣性,並減少大塊紋理圖案的重複性。

【核心要點】

紋理爆炸(Texture bombing)是一種程式化技術,它把小塊影象以不規則的間隔放置。有助於減少團案的失真。

紋理爆炸的基本思想是把UV空間分為規則的單元柵格。然後使用噪聲或者偽隨機函式,把一個影象放在任意位置上的各個單元中。最終的結果是在背景上對這些影象的合成。

由於要組合數以百計的影象,因此實際上這種合成(composite)影象的方法效率並不高。而程式化(Procedural

)計算影象雖好,但是又不適合合成。這篇文章主要講了影象合成和程式化生成這兩種方法,可以發現他們各有優劣。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖紋理爆炸效果圖

很顯然,紋理爆炸也可以擴充套件到3D中,即3D程式化爆炸(Procedural 3D Bombing)

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖程式化的3D紋理爆炸效果

紋理爆炸有一種有趣的變化是在平面上畫Voronoi區域。簡言之,給定一個平面和那個平面上的一系列的點,接近那個點的面積就是點的Voronoi區域。Voronoi圖案類似於樹葉和皮膚上的單元形狀、龜裂的泥土或爬蟲類的皮。如下圖。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖Voronoi區域

總之,紋理爆炸和相關的細胞技術可以給Shader增加視覺的多樣性。使用儲存在紋理中的偽隨機數表和一個小程式,可以增大一個影象或一組影象的變化,並減少大塊紋理區域的重複。

【關鍵詞提煉】

紋理爆炸(Texture Bombing)

3D程式化爆炸(Procedural 3D Bombing)

Voronoi區域(Voronoi Region)

二十二、顏色控制(Color Controls)

【章節概覽】

這章將在遊戲中影象處理的討論,擴充套件到技術和藝術上控制顏色的方法和應用,包括將影象從一些的色彩空間中移入移出,以及快速地給任何2D或3D場景加上精美的色調。

【核心要點】

色彩校正(Color Correction)是幾乎所有印刷和膠片成像應用的一部分。色彩校正可用於將彩色影象從一個色彩空間移動到另一個色彩空間。

我們在電視、雜誌和電影中剪刀的大部分影象,都經過了非常小心的彩色校正和控制。對於這個過程的理解,可以幫助開發者在實時應用程式中得到同樣華美的視覺效果。

色彩校正通常有兩種做法:一是各個通道的校正,分別是改變紅色、綠色和藍色各成分;二是混色操作,基於紅、綠、藍各個成分的同時操作,得到每個通道的輸出值。

色彩校正的機理可以簡潔而容易地在一個shader中描述。重要的是,美術和程式設計師使用的普通工具就能有效地控制他們。在這章中,運用Photoshop建立控制資源,然後通過畫素shader應用到實時程式中。

在Photoshop中提供了一些基於通道校正的工具。如級別(levels)和曲線(Curves)工具。

其中曲線是仿製了化學中的交叉處理(cross-processing)外觀,確切地說,就是在C41化合物中處理E6叫絕所產生的假顏色外觀。這樣的處理已在印刷、電影和電視領域使用多年。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖重新建立交叉處理效果的Photoshop曲線

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖偽交叉處理(a)原始圖(b)曲線調節之後

可以使用下面幾行shader程式碼運用於輸出顏色,使用色彩校正紋理對映,可以隨意地用曲線工具重新建立任何色彩變化:

  1. float3 InColor = tex2D(inSampler, IN.UV).xyz;
  2. float3 OutColor;
  3. OutColor.r = tex1D(ColorCorrMap, InColor.r).r;
  4. OutColor.g = tex1D(ColorCorrMap, InColor.g).g;
  5. OutColor.b = tex1D(ColorCorrMap, InColor.b).b;
複製程式碼

也就是說,使用每個原始的紅、綠和藍畫素的灰度值,確定在梯度紋理中我們尋找的相關位置,然後由梯度紋理本身定義對新顏色的重對映,即由複雜曲線調節所定義的新顏色,如下圖。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖對紅、綠、藍通道重對映結果

【關鍵詞提煉】

顏色控制(Color Controls)

色彩校正(Color Correction)

基於通道的顏色校正(Channel-Based Color Correction)

灰度變換(Grayscale Conversion)

色彩空間變換(Color-Space Conversions)

影象處理(Image Processing)

二十三、景深(Depth of Field)

【章節概覽】

本章主要介紹如何使用GPU建立實時的景深(Depth of Field)效果。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖實時景深效果 Crysis 2

【核心要點】

物體在距離鏡頭的一個範圍之內能夠清晰成像(經過聚焦),在那個範圍之外(或近或遠)則成像模糊,這種效果就是景深。在相機業和電影業中,景深經常用來指示對場景的注意範圍,並且提供場景深度的感覺。在本章中,把這個聚焦範圍遠的區域稱為背景(background),在這個範圍前的區域稱為前景(foreground),而在範圍外的面積稱為中景(midground)。

景深效果由透鏡的物理性質產生。若要穿過攝像機透鏡(或人眼鏡的晶體)的光輝聚到膠片(或人的視網膜)上的一個點,光源必須與透鏡有著特定的距離。在這個距離上的平面稱為焦平面(plane in focus)。不在這個精確距離上的任何東西,投影到膠片上的區域(而不是一個點)稱為模糊圈(circle of confusion,CoC)。Coc的直徑與透鏡尺寸和偏離焦平面的距離成正比。偏離距離小到一定程度,CoC會變得比膠片的解析度更小,攝影師和攝影師稱這個距離為聚焦(in focus),而在這個範圍之外的任何東西都是沒有對準聚點的(out of focus,模糊的)。如下圖。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖 薄的透鏡

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖 模糊圈(circle of confusion)

這章中主要綜述了5種近似景深效果的技術。

1、基於光線追蹤的景深(Ray-Traced Depth of Field)[Cook et al.1984]

2、基於累積緩衝的景深(Accumulation-Buffer Depth of Field)[Haeberli and Akeley

1990]

3、分層景深(Layered Depth of Field)[Scofield 1994]

4、前向對映的Z緩衝景深(Forward-Mapped Z-Buffer Depth of Field)[Potmesil and

Chakravarty 1981]

5、反向對映的Z緩衝景深(Reverse-Mapped Z-Buffer Depth of Field)[Arce and Wloka

2002,Demers 2003]

【關鍵詞提煉】

景深(Depth of Field)

基於光線追蹤的景深(Ray-Traced Depth of Field)

基於累積緩衝的景深(Accumulation-Buffer Depth of Field)

分層景深(Layered Depth of Field)

前向對映的Z緩衝景深(Forward-Mapped Z-Buffer Depth of Field)

反向對映的Z緩衝景深(Reverse-Mapped Z-Buffer Depth of Field)

影象處理(Image Processing)

二十六、OpenEXR影象檔案格式與HDR(The OpenEXR Image File Format and HDR)

【章節概覽】

這章中,大名鼎鼎的工業光魔公司的Florian Kainz、Rod Bogart和Drwe

Hess介紹了OpenEXR標準,這是一種當時新的高動態範圍影象(HDRI)格式,在計算機成像的頂級電影中正在快速推廣。對於基於影象照明的開發者而言,OpenEXR是關鍵的工具。

【核心要點】

OpenEXR是由工業光魔(Industrial Light&Magic,ILM)公司開發的高動態範圍影象(high-dynamic-range image,HDRI)檔案格式。OpenEXR網站是http://www.openexr.org,上面有關於此格式的全部細節。

下圖是一個例子,說明了需要HDR存在的原因。

如下圖是一張顯示相當高的動態範圍的場景,場景中左邊的油燈的火焰比中間小盤子下的陰影大約亮100000倍。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖高動態範圍場景

影象曝光的方式導致了一些區域的亮度超過了1.0,在計算機螢幕上,這些區域被裁剪(clipped)掉,並顯示為白色或不自然的飽和桔色色調。

我們可以通過把影象變暗來校正白色和橘色區域,但是如果把原始影象儲存在低動態範圍檔案格式中,如JPEG格式,把它變暗就會產生相當難看的影象。如下圖。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖普通檔案格式導致明亮的畫素值被不可逆地裁剪,使得明亮的區域變灰,並且細節丟失,得到極不自然的效果

而如果原始影象儲存在高動態範圍檔案格式中,如OpenEXR,儲存明亮的畫素值,而不是把他們裁剪到1.0,然後把影象變暗,就可以產生依舊自然的效果。如下圖。

GPU精粹與Shader程式設計(三):實時輝光與透視陰影貼圖
圖上述變暗的圖的高動態範圍版本。在明亮的區域中顯示出了其他細節,顏色看起來很自然

文章隨後還講到了OpenEXR的檔案結構、資料壓縮、使用、線性畫素值、建立和使用HDR影象相關的內容。有興趣的同學可以檢視原文,這裡就不再贅述了。

【關鍵詞提煉】

高動態範圍(High-Dynamic-Range,HDR)

高動態範圍影象(High-Dynamic-Range Image,HDRI)

OpenEXR


至此,《GPU Gems 1》全書核心內容提煉總結,上下兩篇,完。

With best wishes.

作者:毛星雲
專欄地址:

相關文章