日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于预计算的全局光照技术

發布時間:2023/12/31 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于预计算的全局光照技术 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于預計算的全局光照技術
實時渲染,意味著渲染算法需要在1/30秒甚至更少的時間內生成當前場景在當前視角下的一張2D圖像。盡管這看起來只是在時效上的要求不同,實時渲染和離線渲染采用的的確是兩種完全不同的渲染方法和架構。

傳統的離線渲染算法基本上都依賴于光線追蹤,狹義的光線追蹤是指根據一條光線的傳播方向尋找該光線與場景中表面最近的一個交點,這個過程的計算成本非常昂貴,所以目前的實時渲染算法通常并不能像離線渲染算法那樣計算更完全的光線傳播路徑,而是僅僅只計算所謂的直接光照,然后間接光照通過其它的一些非直接渲染的方法來實現。由于直接光照往往具有比較好的連貫性,因此人們設計出一種高度并行的圖形處理器,用于實現對直接光照的高速實時渲染。

在實時渲染中,直接光照又稱為局部光照(local illumination),它的計算相對比較簡單。相應地,間接光照又稱為全局光照(global illumination, GI),所以通常在實時渲染中我們所說的全局光照其實是指間接光照,實時渲染中的間接光照額計算是相對比較困難的,它們通常會使用一些預計算或者其它一些特殊的近似方法。

對于實時渲染來講,最簡單且高效的方法可能是將光照傳輸過程中的一些計算緩存起來,然后實時渲染可以使用這些預計算的某種形式的數據結果,這些基于預計算的方法仍然是當前階段實時渲染中比較核心的全局光照算法。

根據其對渲染方程預計算的位置不同,實時渲染中有多種不同的預計算光照技術,他們也分別擁有自己不同的名稱,例如預計算輻射傳輸,輻射照度緩存,輻射照度/亮度體積等等,傳統的教材也大都會對它們進行區分并給以單獨介紹,在一些實時引擎渲染引擎(如Unreal Engine和Unity等)中它們也表現為看似完全無關的流程和功能。然而從技術從面,它們卻存在著很多聯系,例如它們大部分都需要基于球協函數和乘機屬性來分離出預計算部分,它們也大都需要借助基于圖像的光照技術來實現預計算,并且通過比較對不同渲染方程不同部分的預計算處理,我們可以更深刻地理解這些預計算全局光照技術的思路。所以,我們這里嘗試將所有這些基于預計算的全局光照技術放到一個章節,除了介紹它們的基本算法,我們可以更深刻的洞悉它們之間的聯系,進而更深刻地理解這些全局光照技術。

10.1 數學基礎
本章所有預計算光照技術的數學基礎是基函數(basis function)的概念及其相關知識。 在數學中,一個基函數是函數空間和(funtion space)中的一個基,就像歐拉(實數或復數矢量)空間中的一個坐標軸一樣。在函數空間中,每個連續的函數都可以表示為這些基函數的一個線性組合,正如矢量空間中的每個矢量都可以表示為各個坐標軸(基矢量)的線性組合一樣。例如,對于所有二次多項式都可以表示為基函數組{1,t,t^2}的線性組合a1+bt+ct平方,這里a,b和c表示各個基函數的系數。此外,傅里葉變換其實也是將一個任意函數表示為一系列三角函數的線性組合。

所以,如果已知一組基函數,則我們可以使用一個矢量來表述一個函數,該矢量的各個分量就是對于各個基函數的線性組合系數。給定一個定義在T上的函數f(t)以及一組基函數Bi(t),該函數可以通過下面的積分被投影(projection):

然后,原始函數可通過這些基函數與其對應系數乘積(如圖10.1(b)所示)的加和形式(即線性組合)被重建(reconstruction),即:

這里N表示系數的數量,一個連續函數通常需要無窮多個基函數的線性組合才能完全被重建,當基函數的數量有限,或者N小于基函數的數量時,上述基函數的線性組合只是原始函數的一個近似,記為。

上面的例子使用了一系列線性(一次)函數作為基函數,它給出原始函數的一個分段線性近似。在工程上最常用的是使用一組相互正交的多項式作為函數基,正交多項式(orthogonal polynomials)是一組具有一些有趣特性的多項式,即任意兩個基函數之間都是相互正交的,所以當任意兩個基函數的乘機進行積分時,只有當兩者完全相同時才會取得非零值,例如:

上式使用了更嚴格的限制:兩個多項式乘積的積分必須返回0或者1,這些特定子集的基函數被稱為標準正交基函數(orthonormal basis function)。

有了上述的理論基礎,我們便可以使用一個分量為各個基函數系數的矢量來表述或近似一個連續函數。很顯然,每個表面處的光照傳輸是一個關于BRDF分布函數,可見性及幾何項的函數,因此如果場景是靜態的,那么該傳輸函數可以被存儲為一個矢量而被重復使用。

然而,這里存在一個問題是,完整表述一個連續函數需要無限多個系數,而光照傳輸發生于每個表面處,即每個表面位置都需要存儲一個系數矢量,這顯然面臨巨大的存儲和計算壓力。為此,我們必須對每個表面點使用少量的系數對原函數進行近似,相對于由分段函數構成的基函數(如圖10.1所示),由多項式組成的基函數還具有另一種特征,不同的基函數能夠表述原函數不同頻率域的特征,階數越高則保留的頻率細節越多,但是需要的系數數量也越多,因此這給出一種可能,即使用少量的低階多項式基函數來近似原函數的低頻部分,這即是預計算輻射傳輸算法的核心思想。

本節首先討論多項式基函數(如勒讓德多項式)的一些特征,以及基于球面坐標系下的一種多項式基函數(即球諧函數),然后將在后面的內容中利用這些基函數的特征來實現預計算輻射傳輸算法。

10.1.1 勒讓德多項式
工程中最感興趣的一類多項式是勒讓德多項式(Legende polynomials),記為Pl(x),其定義域為x屬于[-1,1],伴隨勒讓德多項式Pl,m(x)和Pl,-m(x)是勒讓德多項式的一般化或者說一般勒讓德方程的解,其中l是一個非負整數,而m=0,…,l,這些多項式返回實數(而一般的勒讓德多項式返回復數)值。

對于給定正整數m,伴隨勒讓德多項式可以表述為一般非伴隨勒讓德多項式的形式,即:

有了式10.8和10.9,便可以推導出任意參數l和m下的伴隨勒讓德多形式。

伴隨勒讓德多項式德另一個參數l的意義是什么呢,通過觀察式10.8和10.9,隨著l的增加,變量x的指數會越來越大,實際上l表示了伴隨勒讓德多項式的次數(degree of a polynomial),即多項式中所有單項式中指數次數和的最大值。由此也可以對于每一個固定的l,必須滿足m<=l,因為m>l時(即倒數的階數大于多項式的次數),Pl,m的值始終為0。

圖10.2展示了開頭一些伴隨勒讓德多項式的圖,不難看出,隨著次數l的增大,伴隨著勒讓德多項式的頻率變化變得越來越大,因次我們可以使用少數較低次數的伴隨勒讓德多項式近似函數的低頻部分。

10.1.2 球諧函數
滿足拉普拉斯方程的函數稱為諧函數(harmonic function),或者調和函數,球諧函數(spherical harmonics, SH)則是將球諧函數限制于球坐標系(spherical coordinates)下的單位球面(unit sphere)上,即它忽略了球坐標系的半徑r(因為其被固定于球面上),僅取其方向變化thea和fi。因此正如傅里葉級數(圓上的正弦和余弦函數)是一系列用于表示圓上的方向分布函數,球諧函數可以用來表述球面上的方向分布,例如表面的BRDF分布函數,環境貼圖,光照傳輸,可見性分布等,這些都是僅與方向有關(而與位置無關)的函數。

球諧函數是定義在單位球面上的正交基,因此可以使用以下的參數化:

來描述球諧函數,這里s就是單位球面上的一個位置。球諧函數一般使用符號y表述,其定義為:
這里P正是前面介紹的伴隨勒讓德多項式,而K僅僅是一個用以實現規則化的縮放系數,其值為:

同伴隨勒讓德多項式一樣,我們使用不同的l和m(滿足-l<=m<=l)的組合來獲取所有的球諧函數,這是一個類似金字塔的數據結構,如圖10.3所示,為了簡化表述,通常使用特定的順序將其轉換為一個平坦的一維矢量,所以我們又可以使用下面的序列定義球諧函數:

乘機投影
在前面的內容中,我們已經將整個光照計算分為光源(這里僅考慮與位置無關的環境貼圖)和光照傳輸函數兩部分,這兩部分均可以看做是僅與方向有關的單位球面上的函數,因此可以分別使用一個球諧函數系數矢量進行近似。如果光照交互所處的表面是漫反射表面,則這兩個球面函數乘機的積分是一個常數,因該表面上光照的計算完全可以使用式10.17所示的兩個矢量的點乘表示,這兩個矢量的分量對應于這兩個方向分布函數在球面上的球諧函數投影系數,其中光源的投影系數可以動態調整,而表面上的投影系數可以預計算并緩存起來,以供每一幀執行光照計算,這樣就能提高靜態場景的計算效率,因為對于靜態場景,其光照傳輸是不變的。

然而,當表面是光澤面時,光源和傳輸函數乘積的積分不再是一個常數積分值,因為攝像機從不同方向觀察到的光照是不一樣的,因此它是另一個方向分布函數,此時式10.17不再適用,新的問題轉換為對光影函數和傳輸函數的乘積(其結果為一個方向分布函數)的投影近似,即,設c(s)=a(s)b(s)為兩個方向函數的乘積,我們需要對函數c(s)執行另一個投影近似。

根據投影的定義,其投影系數可表示為目標函數和球諧函數乘機的積分,因此函數c(s)的投影系數可由下式計算:

在上式的第二行中,a(s)和b(s)分布被其投影系數近似,是一個三重積分張量(triple product tensor):

是一個3階對稱張量,這意味著如果在每個表面位置處存儲完全的光照傳輸,這需要每個頂點存儲一個三維矩陣,這顯然占用大量的存儲資源。但這里我們可以把光源部分抽取出來,即假設光照傳輸(即a(s)是已知的(固定的)而光源b(s)是未知可變的,那么表面上每個位置處的光源傳輸僅需要一個二維矩陣,該矩陣可以通過下式計算而出:)

卷積的投影
本書前面已經討論過卷積的意義,它通常用來對原始信息進行平滑和過濾,在卷積計算中,一個核函數h分別作用于一個信號函數f的每一個位置處,其結果是一個更平滑的函數,記為h*f。

核函數同樣可以用來平滑一個用球諧函數表述的方向分布函數,給定一個圓對稱(circular symmetry)的核函數h(z),通過對一個原始函數f執行卷積計算可以得到一個新的球諧函數,注意,這里的核函數h(z)必須是圓對稱的,即垂直于z軸的平面上值相同,因此核函數可以只使用一個變量z表述,這樣才能保證卷積的結果依然位于球面S上。

在球面上,卷積可以直接作用于方向函數的頻率域(類似于傅里葉級數,球諧函數實際上就是方向函數的頻率域),即:

即函數f的卷積就是該函數每個帶l內的所有球諧函數fl,m被核函數的m=0項hl,0執行一個縮放操作,因為核函數是圓對稱的,所以每個帶l內僅只有m=0項(該項球諧函數又稱為帶諧函數)具有非零值。

該卷積屬性提供了一種快速的方法用于計算環境貼圖于余弦核函數h(z)=max(z,0)的卷積計算,該操作可以得到一個輻射照度圖(irradiance map)。此外,卷積計算還可以用于對環境貼圖執行預過濾操作以得到一個更平滑的環境貼圖。

10.1.3.2 ZXZXZ 旋轉
上述的遞推方法不對旋轉矩陣的形式做出任何已知的假設,對于每一次旋轉的計算,它都從最低的次數開始遞歸計算,以構建整個旋轉矩陣的表達式。根據[xxx],遞推方法構建旋轉矩陣的計算復雜度約為O(l三次方),對球諧函數系數矢量執行旋轉操作的復雜度也為O(l三次方)。

[xxx]發現,球諧函數圍繞z軸的旋轉具有比較簡單的形式和計算量,因此提出一種稱為ZXZXZ的旋轉方法,該方法構建旋轉矩陣的復雜度約為上述遞推方法的一半,并且ZXZXZ方法直接推導出一個顯示公式然后直接作用于系數矢量,因此省去了顯式執行旋轉變換的操作,進一步提高了旋轉計算的效率。

該方法首先使用符號積分(symbolic intergration)表述出球諧函數旋轉矩陣中每個元素的函數,即:

上式具有什么意義呢?首先,我們需要解釋以下什么是符號積分?符號積分跟傳統的數值積分具有類似的含義,唯一的區別是數值積分計算的結果是一個確定的值,而符號積分的結果是一個函數,也就是說被積函數中包含除積分變量以外的自變量,可以理解為符號積分就是尋找不定積分的公式形式,一次你上式10.26是一個函數,它給出球諧函數旋轉矩陣Rsh中每個元素的形式;其次,那么旋轉矩陣是關于誰的函數呢?在式10.26中,R是一個使用歐拉角表述的三維旋轉矩陣,因此上述旋轉矩陣元素就是關于歐拉角的函數;最后,為什么式10.26可以用來求球諧函數的旋轉矩陣呢,這是因為yiR(s)可以看作旋轉后的球諧函數基,回想一個函數與某個基函數乘機的積分可以表述為該函數在該基函數上的投影,而坐標變換正是關于每個原始坐標軸(函數)在新坐標系各個基函數上的投影,所以式10.26的積分可以用來表述球諧函數的旋轉矩陣。

因此,如果能夠直接求出式10.26的形式,則可以直接將其用于球諧函數系數矢量的旋轉操作。例如,對于圍繞z軸的旋轉,其可以表述為以下的形式:

根據上式,我們可以得出圍繞z軸的開頭三個帶的9x9旋轉矩陣為:

上述的矩陣形式也可以推廣到次數更高的球諧函數,其中帶l對應的項為lα的正弦和余弦函數。從上述矩陣的結構也可以看出前面介紹的遞推方法的思路,因此高次數的旋轉矩陣對應的正余弦函數可以展開為低次數旋轉矩陣對應的正余弦函數。
上述的矩陣Zα也揭示了一個特征,即圍繞z軸的旋轉矩陣具有比較簡潔而稀疏的形式,因此我們可以設想將整個旋轉矩陣Rsh分解為Rα與其他基本矩陣的組合,根據歐拉旋轉定理,[xxx]使用了ZXZ的旋轉組合,這樣三個基本旋轉矩陣的其中兩個都可以使用上述的圍繞z軸的旋轉矩陣Rα,剩下的問題只需要計算出圍繞y軸的旋轉矩陣即可。[xxx]進一步將該基礎矩陣分解為三個矩陣的組合:首先圍繞x軸旋轉90度,然后在圍繞z軸旋轉β角度,最后在圍繞x軸旋轉-90度。其中,由于圍繞x軸的兩次旋轉角度是固定的,因此這兩個旋轉矩陣可以被預存起來,即:

根據上述過程,原始的旋轉矩陣被分解為以下ZXZXZ的旋轉矩陣的組合:

總結

以上是生活随笔為你收集整理的基于预计算的全局光照技术的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。