Reflective Shadow Maps 論文解析

間接光照

這篇文章可以說是全局光照中一篇超級經典的文章,大家不要被他的名字所騙了Reflective Shadow Maps直譯過來是反射陰影貼圖,可他不是用來解決陰影問題的,而是用來解決間接光照問題的文章。光照可以分爲兩類:一類爲直接光照,這類光照是直接由光源或者發光物發出的光照;另一類爲直接光照之後反射的光照稱爲間接光照。直接光照的計算十分簡單,因爲計算的範圍和次數(沒有反射)有限。而對於間接光照而言計算就十分複雜,因爲間接光照可能不止反射了一次,一束光可能需要經歷了很多次反射才能到達着色點。而間接光照又十分重要,可以看下面兩張圖第一張是隻有直接光照,第二張是直接光照加上間接光照的效果,大家可以看到地板上面有間接光照的會受到周圍環境的影響從而更加的逼真。因此間接光照的模擬是圖形學中一個經久不衰的話題。

在這裏插入圖片描述在這裏插入圖片描述

虛擬點光源

RSM的核心思想是把直接光源照亮的區域又作爲發光物來進行計算。當然RSM只計算一次反射,也就是說先計算直接光照對場景的影響,然後將直接光照照亮的區域再用於計算對場景的影響,一共計算兩次光照。

  • 第一步是先單獨計算直接光照對環境的影響。
  • 第二步就是要獲得直接光照亮的區域,那麼該如何獲得這塊區域呢?其實有個很簡單的辦法,從光源的視角進行一次渲染就可以得到從光源視角看的區域。
  • 第三步就是要用第二步計算的發光區域用於計算間接光照,不過無法直接用這個區域計算間接光照,因此RSM的核心就是把這個發光區域的每一個像素都看成一個光源叫做虛擬點光源(Virtual point light:VPL),然後用這所有的虛擬點光源來計算間接光照。
  • 第四步再將間接光照和直接光照融合起來(直接相加即可)。

具體細節

在這裏插入圖片描述
着色點x收到的虛擬點光源Xp的輻射強度如下所示:
在這裏插入圖片描述
着色點收到的所有的虛擬點光源的輻射強度公式如下所示:
在這裏插入圖片描述

改進

這個算法非常直接簡單,不過簡單的代價就是效率低,大家可以想象如果發光區域很大的話比如長寬爲10241024,那麼虛擬點光源的數量就爲10241024個,如果要老老實實的計算所有虛擬點光源的話效率太過低下。因此文章提出了一個改進的辦法,我們不把所有的VPL都用於間接光照的計算,而是有一個側重的選取。那如何側重呢,作者假設屏幕空間裏面裏這個着色點越近的那麼對光源貢獻就更大。因此我們多選取一點離着色點近的VPL,並且爲了彌補越往外採樣數越少可能會帶來的問題,作者引入了權重,越近了權重越小,越遠的權重越大。如下圖所示。
在這裏插入圖片描述
可以看到隨着採樣距離變大,採樣密度在逐漸減小。並且爲了彌補越往外採樣數越少可能會帶來的問題,作者讓樣本的權重隨着採樣變大而逐漸增大。採樣公式如下:
在這裏插入圖片描述
(s,t)是着色點的屏幕空間的座標,我們可以通過生成兩個隨機數ξ1,ξ2代入上面的公式就可以得到一個採樣座標,然後就可以去第二步生成的發光區域的紋理來採樣生成一個VPL,然後再根據上面的光照計算公式來計算這個VPL對着色點的光照公式,然後再乘以權重ξ1*ξ2即可。

代碼鏈接 https://github.com/AngelMonica126/GraphicAlgorithm/tree/master/TestCase_001_A

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