基於預計算輻射傳遞的全域性光照技術

2021-10-02 14:36:03 字數 1966 閱讀 8184

全域性光照的演算法包括光線追蹤和輻射度兩大類。

光線追蹤是全域性光照計算的經典方法可以繪製出高質量的鏡面反射效果。該方法逆向追蹤到達繪製螢幕上的每乙個畫素的光線,通過與場景中的物體的多次相交,反射以及投射來確定光線路徑,計算該畫素的亮度以及顏色值。儘管光線追蹤技術是一項較為成熟的真實感影象繪製技術,但是其消耗的計算量非常大,以至於現在該技術沒有廣泛地應用到實際中去。

輻射度演算法以熱傳遞理論為基礎,原理是考慮場景中所有面的相互光輻射作用,求解能力平衡方程,獲取場景各個點的亮度。 普通的輻射度演算法計算量和消耗資源量也相當大。

為了渲染出真實感強,繪製高效率的全域性光照效果,sloan根據光照和繪製效果的線性關係,並利用gpu的優越性能,提出了預計算輻射傳遞(precomputed radiance transfer, prt)框架。prt 演算法是採用球面光輻射傳遞對映方法在物體表面建立函式,把任意低頻入射的傳遞表示成輻射度傳遞,其中包括陰影和互動反射。對光輻射傳遞單獨進行預處理,在執行階段,這些轉移函式應用到實際入射光中。光源和光輻射傳遞函式都用低頻球諧波函式描述。在繪製過程中,由於全域性光照計算所需的光輻射傳遞函式資訊已經在預處理中獲得,

而且該函式和光源分布函式都已經分解成正交函式序列,因此最後的出射光強計算化簡為兩者的係數向量的點積,這種繪製速度比較快。

本文通過利用小波技術重建高頻訊號,得到了高頻的光照**效果,並且在實時繪製塔台模擬大規模場景時,採用了自適應細分的演算法,大大提高了繪製機場模型的效率。

1 基於球面和諧函式的prt函式方法

prt演算法表現了在複雜的光源下,由於物體自身的遮擋和反射造成的自陰影和自反射光,這些陰影和反射光都是低頻率的軟陰影和反射。它通過對複雜的光線相互作用進行預計算來節省時間,提供了一種動態改變光照環境的方法,其本質是通過入射光的線性組合來計算每個點的光照,用球面調和函式解碼這些資料。

1.1 真實物理光照模型

如果場景中有nlights個光源,則模型表面的光照顏色用下式計算:

其中:n為表面法線,l為光照方向。

這個光照模型只不過是真實物理光照的簡化,只有完全地模擬物理才能得到真正**級的真實。但物理光照公式計算相當複雜,實現實時計算困難。看下面的物理公式,實際上是在半球上對光線方向(v)的亮度(l)函式進行積分。

1.2 光輻射傳輸函式的預計算

prt演算法的核心是對光照資訊使用球面調和來進行編碼。乙個原始訊號,可以分解為一系列基函式的線性組合,如果要在以後利用這些基函式來重建原始訊號,必須事先得到每個基函式相對應於原始訊號得係數(縮放因子)。比如要計算訊號f(x)中基函式b(x)分量得係數(權重),需要在f定義域上對f(x)b(x)進行積分,也就是所謂的卷積,這一過程為projection。而重建原始訊號,則將經相應係數縮放後的所有基函式求和即可。

prt採用的是一種叫做伴隨勒讓德多項式(associated legendre polynomials)的正交函式。通常用p表示這類多項式,伴隨勒讓德多項式具有兩個引數l和m,定義域為[-1,1],返回值為實數,l和m兩個引數將這些多項式歸為若干組,l便是組的編號,取值為大於0的整數,而m取值為[0,l]的整數,同一組中的任意2個多項式之間卷積為乙個固定的常數項,而不是同組中的任意2個多項式之間卷積又是另外乙個固定的常數。很顯然乙個n組勒讓德多形式一共有n(n+1)項,如果用這些多項式進行訊號projection 可以得到n(n+1)個引數。

當l=0時,球面調和函式可以用來近似環境光照,可以用在ao(ambient occlusion)計算中。而l=1時,因為球面上值呈余弦分布,故可以用來近似漫反射計算中的cos項。現在要利用這些球面調和函式對球面上的原始入射亮度訊號進行編碼,只要在球面上做卷積運算就可以了。

基於GIS的旅遊輻射區人口統計

在旅遊規劃中,考慮旅遊景點周邊的人口負載量是很重要的乙個方面,這將直接影響資源的投入和配置,開發潛力和規模等。基於gis可以將人口資訊進行空間化的展示,還可以通過空間分析的方法計算出旅遊景點輻射區的人口負載量,從而為規劃提供依據。我們需要的就是去找到人口資料和旅遊景點的資料,讓arcgis來幫助我們...

基於MS SQLServer的全表搜尋

最近在做專案的時候遇到乙個問題,就是在查詢記錄的時候輸入關鍵字找出滿足條件的記錄。一開始是每乙個字段乙個關鍵字,後面感覺有的查詢的時候會涉及到6個甚至更多的字段,感覺在查詢的時候相當困難。網上找了很久,想找到一種能夠不需要指定欄位就可以全表搜尋的方法,可惜一直沒找到,最後找到乙個折中的辦法 在每乙個...

計算全緩衝的大小

思路 開啟乙個空檔案,不斷向檔案中寫入乙個字元,乙個字元佔乙個位元組,num 判斷info.st size中是否有資料,一旦有資料,立刻break。然後輸出num.include include include include include include include include incl...