Pbrt的核心是積分形式的光照模型,該模型最終決定了待渲染圖像各像素的顏色值。在pbrt中求解光照模型的部分被稱為積分器。關于積分器的分類可以有多種劃分方式。按光線在僅在物體表面發(fā)生變化還是在三維區(qū)域內(nèi)發(fā)生變化,可以劃分為表面積分器和體積分器。按光照模型中的輸入僅考慮直接來自光源和自發(fā)光物體的光線,還是同時還考慮物體反射產(chǎn)生的間接光照的光線,可以劃分為直接光照積分器和一般光照積分器(或許書中后面部分會有更準確的名稱)。為了由淺入深地介紹積分器的基礎知識和具體實現(xiàn),首先從最簡單的僅考慮表面散射的直接光照積分器開始介紹。
按照pbrt的慣例,對于多種具體的對象,首先要建立它們統(tǒng)一的接口。這里的接口就是積分器接口。該接口僅定義兩個非必須實現(xiàn)的接口函數(shù)。第一個接口函數(shù)是積分工作前的預處理函數(shù),該函數(shù)暫時未被用到。第二個接口函數(shù)是調(diào)用采樣對象,生成一維和二維隨機均勻采樣結(jié)果。在積分器接口的基礎上,定義了表面積分器接口。表面積分器接口中定義了一個必須被實現(xiàn)的接口函數(shù)。該接口函數(shù)即為處理光照模型的函數(shù),它既要能處理反射模型,又要能處理透射模型。在表面積分器接口的基礎上,實現(xiàn)了直接光照積分器。
總體上,直接光照積分器實現(xiàn)了兩種采樣策略。第一種采樣策略是針對某個著色點,考慮整個場景中全部的光源,對每個光源都進行多次采樣,多個光源產(chǎn)生的積分結(jié)果求和后作為該點的輸出。第二種策略是針對某個著色點,僅考慮一個光源的積分結(jié)果作為該點的輸出,當整個場景中有多個光源時,隨機選擇其中一個。第一種策略適合于對單個著色點僅需較少采樣的情況,第二種策略適合于對于單個著色點需要較多采樣的情況。
直接光照積分器雖然是最簡單的積分器,但它同樣也是對BSDF函數(shù)和輻亮度函數(shù)的乘積進行積分。后續(xù)傾向于使用多重重要性采樣的效率提升策略,所以同時需要對BSDF函數(shù)和輻亮度函數(shù)進行采樣,即需要實現(xiàn)積分器接口中的第二個接口函數(shù),即預先生成兩者采樣所需的一維和二維均勻分布隨機變量。當直接光照積分器采用第一種策略時,讀取場景中每個光源所需的采樣數(shù)量,然后由采樣對象生成并統(tǒng)一存儲該數(shù)量的一維和二維均勻分布隨機變量,并返回在全部隨機變量中的尋址地址。由于積分對象是BSDF函數(shù)和輻亮度函數(shù)的乘積,因而BSDF函數(shù)的采樣數(shù)量與對應光源的采樣數(shù)量相同。當直接光照積分器采用第二種策略時,僅需對一個光源生成并存儲一維和二維均勻分布隨機變量。不過書中此處生成的隨機變量數(shù)量為1,個人感覺并不合理。另外還需要額外生成一個一維隨機變量,用于隨機選擇場景中的哪個光源。此外,關于這兩種策略中的采樣數(shù)量,可能還會根據(jù)采樣方法做出調(diào)整。
具體實現(xiàn)直接光照積分的第一種策略時,首先需要讀取采樣對象中預先存儲的隨機變量,形成BSDF函數(shù)和光源的采樣所需隨機變量。若無預先存儲值則直接利用隨機數(shù)對象生成,且
采樣次數(shù)為1次。采樣所需的隨機變量準備好后,就可以計算該次采樣的出射輻亮度值了。然后對每個光源多次采樣的輻亮度的均值求和作為積分器最終的輸出。
具體實現(xiàn)直接光照積分的第二種策略時,首先通過額外生成的一個一維隨機變量,確定選擇哪個光源。若該隨機變量不存在,則利用隨機數(shù)對象生成隨機變量進行光源選擇。然后采用類似于第一種策略的方式,求解該光源多次采樣的輻亮度均值。該均值乘以場景中的光源總數(shù)作為最終輸出。乘以場景中的光源總數(shù)的原因是在考慮選擇單一光源積分的隨機特性后,使該策略的期望值等于選擇所有光源進行積分的結(jié)果。
在處理由BSDF函數(shù)和輻亮度函數(shù)乘積構(gòu)成的待積分函數(shù)時,很難找到滿足該乘積的概率分布。加之BSDF函數(shù)的入射光線范圍和輻亮度函數(shù)的光線范圍可能一個很大,另一個很小,這種情況下僅使用二者中某一個形狀相同的概率分布,將會在總的結(jié)果中產(chǎn)生較大偏差。所以使用了多重采樣策略。首先按輻亮度函數(shù)進行重要性采樣。根據(jù)采樣對象生成一個從光源到著色點的光線,光線包含方向及輻亮度信息。然后考慮空間透射率后對輻亮度進行衰減。將生成的光線方向代入BSDF函數(shù),再與衰減后的輻亮度函數(shù)以及輻亮度采樣的概率密度的倒數(shù)相乘。所得結(jié)果再乘以多重重要性采樣的權(quán)重系數(shù),就得到了多重重要性采樣中按輻亮度函數(shù)采樣的部分。在這一過程中,當光源為delta型光源時,不需要使用重要性采樣。其次,按照BSDF函數(shù)進行重要性采樣,此時已默認光源為非delta型光源。當BSDF函數(shù)表示的為鏡面反射時,無需使用重要性采樣。當BSDF函數(shù)采樣得到的入射光線的方向,對應光源的采樣概率密度為0時,則按BSDF函數(shù)進行重要性采樣的得到的出射輻亮度效用為0.當概率密度不為0時,還需要區(qū)分是無窮大光源還是其他光源。區(qū)分方法是判斷光線與光源是否相交。當為無窮大光源時,根據(jù)光線對象返回輻亮度值。當為其他光源時,根據(jù)光線方向返回輻亮度值。然后再考慮透射衰減和權(quán)重,得到多重重要性采樣中按BSDF函數(shù)采樣的部分。上述兩部分相加得到多重重要性采樣的最終輸出。