【圖形學】體素全局光照GI

前段時間出了虛幻引擎5,介紹說是可以實現實時光線追蹤,感覺不可思議,後來看文章發現大部分的光線追蹤都是基於體素的光線追蹤(消耗比較小),一小部分的光線追蹤是基於屏幕的射線。於是找了文章開始瞭解體素光線追蹤。

這個技術是英偉達提出來的,不算真正意義上的光線追蹤,有點近似的感覺,但是效果也很逼真,下面介紹一下:

本文算法總共有四個階段,分別爲體素化、直接光照、各向異性過濾、間接光照,算法的各個階段如圖1所示。第一階段是體素化階段,將圖元爲三角形的場景轉換爲體素場景,計算單個體素的基礎屬性並存儲。第二階段是直接光照階段,計算光源照射到每個體素上的直接光照,並將其作爲出射輻射度存儲在體素中。第三階段爲各向異性過濾階段,將體素的出射輻射度經過各向異性過濾形成層級,既簡化了存儲光線傳輸的方向,又保持後續採樣的一致性。第四階段是體素錐追蹤階段,通過錐體的光線束來收集第二階段中體素的出射輻射度,並用來計算間接光照。

圖1 四個階段

第一個階段就是場景體素化。原來場景的Mesh都是由三角形面片組成的,現在轉換成立方體塊的體素,這裏稍微有點疑問,體素化是發生在哪一個階段呢,我個人認爲這裏是進行了預結算,把場景直接體素分塊,然後在攝像機旋轉的時候再去獲取相應場景的體素塊。(文章中的體素塊是被做成三維紋理來存儲的,可以用一個三維座標來獲取體素值,這裏的體素值裏包括法線等信息(如果是有法線信息,那麼這個法線應該是在世界座標空間系裏的))

第二個階段是計算直接光照,就是利用光線傳輸方程,出射輻射度等於所有入射輻射度之和,不過一個體素中可能有多個法線,這時不能做簡單的加法然後取均值,因爲均值之後這個法線可能就收不到光照了,所以要考慮衰減值等等。具體公式如下:

:k 爲體素內子三角形的數量;nj爲體素內子三角形的法線;V 爲法線衰減值;ns和Ls爲法線和入射光在三個座標軸上的分量。根據均值法線的方向選取入射光主軸方向,分別計算三個軸上的衰減,再採用法線權值求和,以避免均值法線方向不當而影響體素內光照的情況。

還要計算環境光遮蔽情況,(這裏簡單解釋一下AO環境光遮蔽,就是用來模仿全局陰影,從一個點出發向半圓球內射線,如果命中物體射線越多,則這個點越暗,命中光源越多,這個點越亮)

第三個階段是各項異性處理,這裏留個坑 沒太看明白

第四個階段就是利用體素錐進行追蹤,

這裏,漫反射通過6個光圈值爲60°的錐進行追蹤如圖b,高光反射通過一個光圈值爲10°的光錐進行追蹤,如圖d。

這裏的l是出射輻射度的反方向,也就是視線方向。

單個光錐追蹤

這裏的利用體素錐進行追蹤和光線追蹤有點不同,區別在於它是一個整體的光線步進,如上圖,而傳統管線追蹤是每個光線單獨去步進檢測碰撞。

單個錐體採樣的過程類似於光線步進,錐體的光圈值爲γ,錐體的方向爲d,錐體每一步會步進一定的距離,然後對輻射體進行一次採樣,採樣的層級由錐體底端的半徑確定。設t 爲步進的距離,則錐體底部的半徑r=2t×tan(γ/2),採樣層級爲log2(r/Vmax),Vmax爲漸近貼圖最高層級的體素邊長,即三維場景的最長邊的大小。在第m步中,錐體都需要對輻射度cm與累積遮蔽值am進行計算。如下圖

錐體累積到指定的距離後,cm就是間接光照值。

這裏一些法線的計算,還有各向異性計算都是paper中提到的,一般的算法流程中可能略有不同。但是總體流程大致相似

參考資料

  1. 桂梅書, 侯進, 譚光鴻,等. 基於體素錐追蹤的全局光照算法[J]. 光學學報, 2019, 39(6).
  2. 博客https://blog.csdn.net/pizi0475/article/details/49422123

 

 

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