學習Spherical Harmonics的簡記

2022-05-17 16:05:54 字數 938 閱讀 9921

說的不對請拍磚!orz

sh是一種特殊的函式,高階的sh可以還原非常複雜的函式,而低階的sh比較適合還原低頻函式。現代gpu硬體通常支援4個channel的texture,或者支援大頂點格式,這也為4階以內的sh(需要4^2=16個係數)在gpu上的實現奠定了基礎。

很多函式可以近似分解為多個不同相位、不同頻率的正弦波,也是傅利葉變換所解決的問題。sh也類似的,由多個基函式疊加合成,對於不同的基函式有不同的係數,使得sh可以模擬很多函式,當然它的特性在圖形學的範疇內是比較適合模擬diffuse光照中各向同性的特點。

sh有幾個牛逼的特性,乙個是rotation invariant,對於旋轉,存在乙個旋轉函式可以把sh旋轉過來。還有乙個就是dot product,由於正交性,可以把sh函式相乘的積分化解為幾個dot product!在我看來這是使用sh的最主要目的了。

在prt及其變種中,sh對原函式的壓縮和還原是作為核心思想直接使用的。而prt也受到了sh帶來的限制,即球諧的特性導致了各向同性,在diffuse情況下工作得很好,而完全不能用在specular的情況下。所以specular的東西還是需要其他的模型去實現。

實現prt的話,我們這樣做:

1)預計算,通過raytracer獲得頂點或紋素上的輻射度傳遞資訊,如果你懶得實現乙個raytracer的話,你可能只能得到無陰影,無相互反射的n dot l的效果。當然這輻射度資訊的部分如果用gpu來加速應該也是可行的。將輻射度資訊投影到sh空間,儲存輻射度的sh係數。

2)執行時,把球面上的光照向量投影到sh空間,儲存為光照sh係數。在shader中通過madd也就是一系列點乘運算將輻射度sh係數和光照sh係數乘起來,就可以得到最終輻射度的效果,將其作為引數加入光照模型即可得到一幅低頻的,有軟陰影甚至是interreflection的diffuse畫面。

當然實際情況遠沒那麼簡單,尤其是sh係數的旋轉,很煩。目前d3dx中的d3dxshrotate也只支援最高6階的sh。

學習學習再學習

如果乙個技能足夠複雜 比如從零學程式設計 那就不要指望讀完一本書就可以打天下。多買幾本書同類的書 因為每個作者的出發點是不一樣的,哪怕對同乙個概念都有不同的解釋說明。理解知識的重要過程之一就如牛的反芻一樣,要嚼一遍 嚥下去 再吐出來 再嚼一遍 再嚥下去 所以,既然一本書可以讀幾遍,那麼同一話題多應該...

學習 學習 再學習

原本要使用vs2005開發乙個b s專案的,沒有想到只能先暫時停停了,居然跟不上技術的發展了,呵呵,一直使用delphi delphi也沒能跟上 沒有想到轉到vs2005上竟然有這麼多要學的東西,當然目的是了做乙個好的系統。最近一直在學習asp.net ajax,雖然專案停了,但是我覺得值得,有很多...

只是學習 學習 再學習

通過做 讓我學會了很多東西 什麼 flash div css html js as 雖然都只是皮毛 不過 算是了解那麼一點點吧 哈哈 我還突然發現 我的 數學和英語 進步了不少 而且還都是很實用的 比在學校的進步可快多了 那句話說的很不錯 在你了解了一些皮毛之後你會發現很多東西你都必須去學。因為少一...