Spherical Harmonics 101

Spherical Harmonics 101

來自專欄 Grfx.IO

// 一段神秘數字1.933214,1.862957,1.624974-0.896699,-0.8683487,-0.86257210.2199631,0.3142451,0.3953283-0.02590038,-0.03190511,-0.089949240.097487,0.1031978,0.077221-0.2191523,-0.2287068,-0.24548070.6572484,0.5694487,0.46143140.06744754,0.06944514,0.0337911-0.1330402,-0.1244516,-0.1253917-0.01545269,-0.01670636,-0.0604602-0.05840207,-0.06341131,-0.07897126-0.1572947,-0.09648941,-0.1066807-0.150643,-0.06921952,-0.013129610.07529882,0.06664002,0.0063680350.02295128,0.03182271,0.01612743-0.03092262,-0.02979236,-0.017255530.05760896,0.05548308,0.05978746-0.07219185,-0.07933418,-0.08149352-0.03185565,-0.02565615,-0.073764550.03838918,0.01289316,0.026836430.5313385,0.4806517,0.4225594-0.07688528,-0.08110702,-0.068465660.08034892,0.08435476,0.08413868-0.01619668,-0.02262211,-0.05849415-0.005963644,-0.00482136,-0.0155279

之前在Image Based Lighting中使用的是Cubemap[1], 使用Cubemap其實很方便,直接LOD就獲得從高頻到低頻的信息:

LOD 0

LOD 7

但是不可忽視的是它的內存佔用,畢竟是貼圖,而且需要6張。而且在cubemap的接縫處也會有問題,這個問題Zimmerman[1]解釋過.綜上所述, cubemap做單個場景demo還可以,但是用來當烘焙光照用的probe[3]顯然就不現實了。

SH Recap

關於SH推薦閱讀下Peter-Pike Sloan[4]和Robin Green[5]的文章。

使用一組基函數映射原函數. 截圖來自Green[4]

對前面經過映射得到的係數和基函數做操作,可以近似出原函數. 截圖來自Green[4]

截圖來自Green[4]

如果懶得看推薦的文章也沒關係,這裡簡述下就是: 我們可以把空間信息壓縮到幾個參數中, 一般來說paper中推薦的3階SH使用9個係數,5階使用25個.這對貼圖數據的內存佔用來說是極大的節省. 通常probe不需要高頻信息, 所以使用3階或者5階已經滿足需求了.

所以文首的那組數字就是題圖經過"壓縮"後得到的5階SH的係數, 你不需要原圖,只使用這25個係數, 跟5階SH的那幾組基函數"相乘"就能得到題圖的結果. 是不是很神奇!

下面是幾組測試結果(感謝hdrlabs提供的原圖):

有興趣想體驗的童鞋可以下載自製小程序:

點此下載( 密碼: veip)

校驗碼

用法很簡單,命令行下輸入:

BlurGen.exe /S a.jpg

如果要輸出3階的SH係數和對應的效果圖,加"/L"即可。

最後會在同目錄下輸出對應的output文件和一個係數表,便於測試。

因為只是隨手寫的體驗測試代碼,所以很多地方很隨意,請見諒。。。


[1] Kevin Bjorke,Nvidia, Image-Based Lighting, 2007.

[2] Amelia Zimmerman, Cube map seams: Why they occur and how to avoid them, 2016.

[3] Robert Cupisz, GDC2012,Light probe interpolation using tetrahedral tessellations, 2012.

[4] Peter-Pike Sloan, Microsoft, Stupid Spherical Harmonics (SH) Tricks, 2008.

[5] Robin Green, Spherical Harmonic Lighting: The Gritty Details , 2003.


推薦閱讀:

深入淺出基於物理的渲染一
從零開始手敲次世代遊戲引擎(五十三)
《Real Time Rendering》之Vertex Blending/Skinning
一起來寫Unity渲染管線吧!零 開篇

TAG:計算機圖形學 | 實時渲染 |