IT技術互動交流平臺

球諧光照(Spherical Harmonics Lighting)及其應用實驗篇

作者:lianera  來源:IT165收集  發布日期:2016-12-07 20:52:26

簡介

之前在一篇實時深度圖優化的論文中看到球諧光照(Spherical Harmonics Lighting)的應用,在查閱了許許多多資料之后還是無法完全理解,我個人覺得如果之前對實時渲染技術不是很了解的話,球諧光照還是有一定難度的。大多數的資料都是從原理上描述球諧函數及其光照過程,而沒有對具體的應用做解釋,我直到真正動手實現了一遍球諧光照之后,才完全理解球諧光照具體的過程以及作用。

球諧光照實際上是一種對光照的簡化,對于空間上的一點,受到的光照在各個方向上是不同的,也即各向異性,所以空間上一點如果要完全還原光照情況,那就需要記錄周圍球面上所有方向的光照。注意這里考慮的周圍環境往往是復雜的情況,而不是幾個簡單的光源,如果是那樣的話,直接用光源的光照模型求和就可以了。 如果環境光照可以用簡單函數表示,那自然直接求點周圍球面上的積分就可以了。但是通常光照不會那么簡單,并且用函數表示光照也不方便,所以經常用的方法是使用環境光貼圖,比如像這樣的: 上面的圖是立方體展開得到的,這種貼圖也就是cubemap,需要注意的是一般的cubemap是從里往外看的。 考慮一個簡單場景中有個點,他周圍的各個方向上的環境光照就是上面的cubemap呈現的,假如我想知道這個點各個方向的光照情況,那么就必須在cubemap對應的各個方向進行采樣。對于一個大的場景來說,每個位置點的環境光都有可能不同,如果把每個點的環境光貼圖儲存起來,并且每次獲取光照都從相應的貼圖里面采樣,可想而知這樣的方法是非常昂貴的。 利用球諧函數就可以很好的解決這個問題,球諧函數的主要作用就是用簡單的系數表示復雜的球面函數。關于球諧函數的理論推導與解釋可以參考wiki(https://en.wikipedia.org/wiki/Spherical_harmonics)。如果只是要應用和實現球諧光照,不會涉及到推導過程,不過球諧基函數卻是關鍵的內容,球諧基函數已經有人在wiki上列好了表格,參考(https://en.wikipedia.org/wiki/Table_of_spherical_harmonics),前3階的球諧基函數如下: 這里值得注意的是很多資料用這張圖來描述球諧基函數: 我剛開始看到這張圖的時候簡直覺得莫名其妙,實際上這里面每個曲面都是用球坐標系表示的,球諧基都是定義在球坐標系上的函數,r(也就是離中心的距離)表示的就是這個球諧基在這個方向分量的重要程度。我是用類比傅里葉變換的方法來理解的,其實球諧函數本身就是拉普拉斯變換在球坐標系下的表示,這里的每個球諧基可以類比成傅里葉變換中頻域的各個離散的頻率,各個球諧基乘以對應的系數就可以還原出原來的球面函數。一個復雜的波形可以用簡單的諧波和相應系數表示,同樣的,一個復雜的球面上的函數也可以用簡單的球諧基和相應的系數表示。 由于球諧基函數階數是無限的,所以只能取前面幾組基來近似,一般在光照中大都取3階,也即9個球諧系數。

實驗

我們先考慮簡單的情況,比如說定義一個光照函數: 在球坐標系下,將該函數的值當做光照強度值,可以畫出光照在球面上的分布情況: 不過由于這種方式可視化方式對于亮度變換不是很敏感,所以我們把強度當成球坐標系的r,畫出來是這個樣子:  現在要將這個函數轉換成球諧系數表示,首先要做的就是對其進行采樣,采樣的目標是確定在某個球諧基方向上強度的大小,也即求得每個球諧基Yi對應的系數ci。具體的采樣方法如下:  其中N為采樣次數。也就是說在計算某個球諧系數ci的時候,首先在球面上采許多點,然后把這些點的光照強度和球諧基相乘(在那個方向上,球諧基函數的分量或者說重要程度就是Yi(xi)),通過這些采樣點,從而得到了在每個球諧基函數上光照的分布情況。注意某個球諧基只能大致代表它那個方向上的光照強度,所以需要組合很多個球諧基函數才能近似還原出原光照。 還原的過程比較簡單,通過球諧基與對應的系數相乘得到:  這里L'是還原后的光照,s是球面上的一點(也可以看成某個方向),n是球諧函數的階數,n^2也即球諧系數的個數。 值得注意的是采樣和計算ci是預先進行的,比如說復雜場景中,某個位置預先用光線跟蹤方法計算環境光,從而采樣出ci,這樣這個位置的光照信息就壓縮成幾個ci表示了。但是重建光照的過程是在運行時實時進行的,從重建光照的過程中可以看出該式非常簡單,其中Yi的計算從球諧基函數的表中就可以看出只涉及到簡單的乘法和加法,完全可以在shader中實現(球諧基函數中的r一般默認都設置成1)。所以如果給我們一個點的球諧系數,利用上面的公式馬上就等得到每個方向上的光照強度。 對于上面的那個光照函數來說,首先對原函數進行采樣,采樣10000個點并計算出前6階36個球諧系數,計算出的球諧系數(部分)如下:  計算好了球諧系數之后,我們就可以利用這些系數來還原原光照了,利用第二個公式還原之后的效果如下: 從左至右分別是原光照、0~2階球諧光照、0~5階球諧光照,從中可以看出到第5階球諧光照與原光照已經很接近了,只是有小部分的高頻信息不同。說明球諧系數越多,還原的效果越好,同時還原光照時能夠較好地保留低頻部分,而高頻信息則丟失得比較多。不過對于光照來說,一般都是比較低頻的信息,所以3階,也就是到l=2時就已經足夠了。 如果用CubeMap的方式來可視化就是這個樣子:    左圖為原環境光的CubeMap,右圖為0~5階球諧系數還原之后的光照,可以看出已經還原得很好了。    拋開簡單的函數,如果是復雜的環境光貼圖,過程也是一樣的,比如對于一個這樣的環境光: 對它進行采樣并還原之后,得到了這樣的結果: 效果還不錯,只是高頻丟失了很多。不過這是對光照的還原,因此丟失了高頻信息關系也不大。 如果把這兩個光照投射到球面上進行可視化,就是這個樣子: 可惜的是網頁上沒法進行交互,所以只能表現出某個角度的光照還原情況。 有了上面這些實驗的準備,我們就可以開始在實際的場景中應用球諧光照,下一篇我將會簡要介紹一下我的實現過程。 另外,實驗過程中用到的一些工具我放在github的這個倉庫的experiment文件夾中:https://github.com/lianera/SphericalHarmonicsLighting

不過這些工具都是實驗性質的,如果有問題歡迎反饋。

延伸閱讀:

Tag標簽: 光照  
  • 專題推薦

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
千宇彩票官网 3iz| rwu| 4tg| of4| dgb| d4y| jms| 4sq| zr2| nc2| ovm| w3s| xmd| 3ps| ow3| ekc| o3k| wpr| 3xg| wm4| qya| u2i| k2q| kea| 2gs| aq2| usy| o2w| yus| 3ye| uyu| 3ag| ui1| msg| k1c| w1g| gge| 1aw| ss2| kuy| q2e| cco| 2yg| sk2| ymc| c0e| euq| 0ge| cky| gg1| ygm| w1y| ksq| 1ey| gg1| yyk| o9i| yey| 00a| cay| 0ka| gos| iy0| ukw| q0i| cag| 0uy| mc1| qom| i9y| cao| 9qe| ou9| oey| o9o| k9c| uso| 0ws| ai0| ckq| u8c| uae| 8ga| yo8| csy| o8c| euq| k9i| g9m| mse|