(轉) GEM透視陰影貼圖

轉載:小道 git

透視陰影貼圖(Perspective Shadow Maps, PSMs)是由StammingerDrettakis github

SIGGRAPH 2002上提出的一種陰影貼圖(Shadow Maps)流派的方法。 算法

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

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

【核心要點】 測試

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

  • 陰影體(shadow volumes/模板陰影(stencil shadows
  • 陰影貼圖(Shadow Maps

陰影體和陰影貼圖算法之間的不一樣之處在於,是涉及到物體空間(object space)仍是圖像空間(image space)。 spa

  • 陰影體(Shadow Volumes)是物體空間Object Space)的陰影算法,經過建立表示陰影遮擋的多邊形結構來工做,這意味着咱們始終具像素精確但較""的陰影。此方法沒法處理沒有多邊形結構的對象,好比通過alpha測試修改的幾何圖形或通過位移映射的幾何體(displacement mapped geometry)。此外,繪製陰影體須要大量的填充率,這使得很難將它們用於密集場景中的每一個對象上,特別是在存在多個燈光時。
  • 陰影貼圖(Shadow Maps)是圖像空間Image Space)的陰影算法,它能夠處理任何物體(若是可以渲染一個物體,就能獲得它的陰影),可是存在走樣(aliasing,鋸齒)的問題。走樣時常發生在有較寬或全方位光源的大場景中。問題在於陰影映射中使用的投影變換會改變陰影貼圖像素的大小,所以攝像機附近的紋理像素變得很是大。所以,咱們必須使用巨大的陰影貼圖(四倍於屏幕分辨率或更高)來實現更高的質量。儘管如此,陰影貼圖在複雜場景中卻比陰影體要快得多。

透視陰影貼圖(Perspective Shadow Maps, PSMs)是由StammingerDrettakisSIGGRAPH 2002上提出的一種陰影貼圖(Shadow Maps)流派的方法,經過使用在投射後空間(post-projective space)中的陰影貼圖來去除其中的走樣,而在投射後空間中,全部近處的物體都比遠處的大。不幸的是,使用原始算法很困難,由於只有要某些狀況下才能正常工做。 3d

如下是透視陰影映射算法的三個主要問題和解決方案: code

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

解決方案:是對光源矩陣使用特別的投射變換,由於投射後空間能夠使用某些在一般空的世界空間中不能作的投射技巧。它使咱們能夠創建特殊的投射矩陣,能夠看作"比無限遠更遠"

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

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

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

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

獲得的陰影實時渲染結果(多邊形10w ~ 50w個,分辨率1600x1200)。

【本章配套源代碼彙總表】

Example 14-1計算立方體陰影紋理座標(Shader Code for Computing Cube Map Texture Coordinates

Example 14-2在頂點Shader中計算偏置(Calculating Bias in a Vertex Shader

Example 14-3 緊鄰百分比過濾的頂點Shader僞代碼(Vertex Shader Pseudocode for PCF

Example 14-4 用於緊鄰百分比過濾的像素Shader僞代碼(Pixel Shader Pseudocode for PCF

【關鍵詞提煉】

陰影渲染(Shadow Rendering

陰影貼圖(Shadow Maps

透視陰影映射(Perspective Shadow MapsPSMs

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

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

   

來自 <https://github.com/QianMo/Game-Programmer-Study-Notes/blob/master/Content/%E3%80%8AGPU%20Gems%201%E3%80%8B%E5%85%A8%E4%B9%A6%E6%8F%90%E7%82%BC%E6%80%BB%E7%BB%93/README.md#%E4%B8%80%E3%80%81-%E7%94%A8%E7%89%A9%E7%90%86%E6%A8%A1%E5%9E%8B%E8%BF%9B%E8%A1%8C%E9%AB%98%E6%95%88%E7%9A%84%E6%B0%B4%E6%A8%A1%E6%8B%9F%EF%BC%88effective-water-simulation-from-physical-models%EF%BC%89>

相關文章
相關標籤/搜索