DX提供了一組用來操作Sphereical Harmonic的基本函數,如D3DSHAdd、D3DSHDot、D3DSHEvalDirection等;其中有一個是D3DSHProjectCubeMap,用來從CubeMap投影得到對應的SH係數,還是蠻有用的。一般情況下,在遊戲情境中需要使用Light Probe時需要設定不同的採樣點,然後產生對應上的Probe並計算SH係數,這些SH係數用來Realtime Compute環境光線對物體的影響。計算Probe的SH係數有一般有兩種方法:
- 使用Ray-Tracing的方法:直接從Probe所處的位置上向外進行光線發射並求交得到球面採樣點上的環境採樣值,並做球諧係數的計算。一般來說這種方法可能比較麻煩,甚至會比較慢,特別是在遊戲中所使用的情境較大、且引擎並不直接支援光線跟蹤時更為不便;
- 使用Raster Cube-Map的方法:首先使用GPU渲染管線產生Probe位置上的一個Cube-Map,然後在此Cube-Map的基本上計算該點所對應的SH係數。一般來說,在引擎的情境編輯器中可能已經整合了產生Cube-Map的功能(因有許多地方會用到Cube-Map,比如各種靜態反射等),因而此種方法使用起來就很方便,只需增加一個從Cube-Map到SH的計算即可。
從Cube-Map計算其對應的SH係數也同樣有兩種方法:第一種同樣類似於光線跟蹤,只不過這裡可以直接從Cube-Map對應的Texture中採樣到相應光線方向上的情境資訊,當然,這需要額外實現一下,但是卻可以更加靈活地控制採樣數量等一些參數;另一種方法就是使用DX提供的D3DSHProjectCubeMap來直接進行計算。其傳入兩個參數:SH的Order以及Cube-Map貼圖,返回對應Order上R、G、B三個通道上的SH係數(注意要根據SH的Order傳入足夠的係數空間)。簡單試用了一下,效果還可以(計算出SH係數後再重建):
當然,這個不只能Light Probe能夠用上,其它諸如Irradiance Environment Map等的計算同樣可以這樣操作。