光子映射是粒子追蹤算法的一種,基本思想是用光子來表征從光源傳遞到渲染的點的能量,在這一過程中腺占,傳遞的能量不通過光線的輻照度來體現(xiàn)琉朽,而是通過光子的數(shù)目和光子的作用范圍來體現(xiàn)毒租,可以說這種方法是從光的粒子性來考慮的。在介紹光子映射及其改進前箱叁,首先介紹粒子追蹤算法墅垮。
粒子追蹤算法是分析光線傳播問題的一種直觀方法,不過要利用該算法解決一些具體問題耕漱,就還需要對算法進行更深入的建模和分析算色。書中給出的建模方法是將場景中光照分布的采樣用各處光子的歷史累積數(shù)量和權重來表征。當每個光子從光源發(fā)出后孤个,一旦與某表面相交后剃允,就將由交點位置、入射方向和采樣數(shù)據(jù)構成的光子信息存儲到歷史數(shù)據(jù)中齐鲤。其中的采樣數(shù)據(jù)將包含路徑吞吐量函數(shù)和采樣時的概率密度信息斥废。實際上采樣數(shù)據(jù)就對應光線傳輸方程中的入射輻照度乘以一個余弦值再除以概率密度部分。此外给郊,各個光子還額外包含一個權重信息牡肉。權重信息是入射點和光線方向的函數(shù)。如果權重信息都取1淆九,那么所有光子的采樣均值就等于該處的光通量统锤。產(chǎn)生這些光子的方式可以使用不同的策略,不過總體而言都是從光源出發(fā)經(jīng)過若干次反射后到達某點炭庙。每次光子所經(jīng)歷的路徑長度可以不同饲窿。使用這些光子的一個優(yōu)勢在于,每次它們的采樣值不變焕蹄,只是根據(jù)需要修改權重信息逾雄,這樣就可以降低運算量。
下面介紹光子映射。首先考慮最簡單的計算表面一點的出射輻照度的方程鸦泳。方程中的入射輻照度是關于反射點和入射方向的函數(shù)银锻,把它等效為在反射點周圍一個表面上的若干delta分布的輻照度以各自的輻照度對反射點作用的和。此時做鹰,按粒子追蹤的思路击纬,權重可以取為delta函數(shù)和BSDF函數(shù)的乘積。由于權重中含有delta函數(shù)钾麸,因而采樣得到的光子能對應到非零權重的概率為0更振。解決這一問題的方式也正是光子映射引入偏差的原因。解決該問題時喂走,將delta函數(shù)轉變?yōu)橐粋€濾波函數(shù)殃饿,這個濾波函數(shù)效果是,某處的光子越多芋肠,它的權重越大乎芳,所產(chǎn)生的輻照度就越大。除了提高效率的優(yōu)點外帖池,還可以使用到某點附近的光子奈惑。當使用增量式的路徑跟蹤方法時,有些路徑很難被采樣到睡汹,但是通過利用某點附近的光子肴甸,就可以引入這些難被采樣到的路徑的作用。實現(xiàn)上述的濾波函數(shù)時囚巴,首先要選擇一個核函數(shù)原在,該核函數(shù)在負無窮到正無窮范圍內(nèi)積分值為1,且在0處取值最大彤叉,在0兩側對稱分布庶柿。當然該核函數(shù)可以僅在有限區(qū)間中取非0值,例如書中所采用的Epanechnikov核函數(shù)秽浇。使用核函數(shù)時浮庐,跟每個光子所在的位置進行平移,并按某寬度進行縮放柬焕。然后對所有光子處理后的核函數(shù)進行歸一化處理审残。縮放所使用的寬度斑举,通過采樣該點處第N近的距離得到搅轿,并且為幾維變量,距離就取幾次方富玷。
光子映射算法的使用包括兩個階段璧坟,第一個階段是計算并存儲從光源發(fā)射到表面得到的光子采樣數(shù)據(jù)没宾,一般采用kd樹的形式來提高存儲和讀取的速度。第二個階段是基于由相機發(fā)出光線到達的表面交點處附近的光子數(shù)據(jù)沸柔,計算要輸出的輻照度值。對于這種算法铲敛,需要提前計算并存儲場景中的全部光子褐澎,因而所能使用的光子數(shù)量將受限于存儲空間。因而渲染圖像的經(jīng)度就受到限制伐蒋,無法通過多花時間來提高渲染精度工三。