在實時全局光照的預(yù)處理階段完成后竖瘾,場景中的全部虛擬光源都已生成并存儲,接下來就可以按實時全局光照的算法對場景進行渲染了。它總體的實現(xiàn)思路與直接光照模型相同卿嘲,都是在僅考慮光源(這里包括虛擬光源)直接照射的結(jié)果的基礎(chǔ)上,針對表面一個點的某一個出射方向夫壁,計算它的出射輻亮度拾枣。
實時全局光照算法在使用虛擬光源進行出射輻亮度的計算前,首先完成了兩部分常規(guī)的輻亮度的計算盒让。第一部分是該點的自發(fā)光梅肤,換言之該點本身為區(qū)域光源時所產(chǎn)生的出射輻亮度。第二部分是場景中光源(不包括虛擬光源)發(fā)出的光線在該點作用后產(chǎn)生的出射輻亮度邑茄。此處按直接光照模中型對全部光源進行采樣的方式進行計算姨蝴,此處不再展開。
完成前兩部分的計算后撩扒,針對場景中的虛擬光源在該點作用產(chǎn)生的出射輻亮度進行計算似扔。該計算利用了之前提到的光源集合的概念,即僅針對某一個光源集合中的全部虛擬光源進行計算搓谆,全部虛擬光源作用結(jié)果之和將作為最終輸出炒辉。光源集合由隨機方式進行確定。這是pbrt在實現(xiàn)實時全局光照時給出的方式泉手,實際上書中也提到過針對光源集合還存在更為多樣的利用方式黔寇,比如使用全部光源集合進行采樣計算。
計算每個虛擬光源產(chǎn)生的作用效果時斩萌,其基本過程只需計算確定出射和入射光線方向后的bsdf值缝裤、光線傳輸方程中的幾何項G以及光源的輻亮度的乘積再除以光源集合中的虛擬光源的數(shù)量,然后再乘以介質(zhì)衰減特性對應(yīng)的系數(shù)即可颊郎。個人理解憋飞,在常規(guī)的直接光照模型算法中,產(chǎn)生一個點的出射輻射度時姆吭,計算的是每根入射光線的輻亮度除以其采樣概率的和榛做。此處通過循環(huán)會計算每個虛擬光源對該點產(chǎn)生的光線的作用效果之和,因而也需要除以概率密度内狸,而此時的概率密度就是光源數(shù)目的倒數(shù)检眯。完成這一基本過程后,還需要針對虛擬光源的特殊性進行特殊處理昆淡。這里的特殊性主要是虛擬光源在場景中分布較廣锰瘸,會有較大概率出現(xiàn)一些光源和反射點距離很近的情況。由于在要計算的幾何項G中昂灵,光源和反射點的距離的平方存在于分母上避凝,因而就會出現(xiàn)一些幾何項很大的情況舞萄,進而導(dǎo)致局部過亮的情況出現(xiàn)。該問題的解決方案是針對幾何項進行限幅處理恕曲。后續(xù)再對限幅后產(chǎn)生的偏差進行補償鹏氧。第二項特殊處理是按俄羅斯輪盤賭的方式,按一定概率舍棄產(chǎn)生的輻亮度比較弱的光線佩谣,書中使用的概率是90%,即反射光線的輻亮度小于某確定閾值后按90%的概率舍棄該光線实蓬。完成上述兩項特殊處理并驗證反射光線不被遮擋后茸俭,將其輻亮度累加到最終輸出中。另外安皱,當(dāng)虛擬光源在生成時所在路徑加1小于一個最大鏡面反射深度時调鬓,還計算該光線產(chǎn)生的鏡面反射和投射效果。
下面具體介紹一下第一項特殊處理的原理和補償方式酌伊。首先針對幾何項G進行一種等價變換腾窝,變換后幾何項可以表示為某兩個數(shù)的最小值后另外兩個數(shù)的最大值之和,前者的兩個數(shù)分別為幾何項和幾何項的閾值居砖,后者為幾何項與幾何項的閾值之差和0虹脯。在原計算式中僅考慮前者,即為補償前的結(jié)果所對應(yīng)的表達式奏候。將后者代入原計算式中循集,將表達式中的關(guān)于面元的積分變量變?yōu)殛P(guān)于立體角的積分變量,并在分母中引入幾何項G后蔗草,可以得到一個不會受光源和反射點距離近的影響的積分表達式咒彤。針對這個表達式進行采樣,就可以計算相應(yīng)的補償項咒精。在計算補償項時镶柱,需要注意幾點。第一模叙,僅在虛擬光源在生成時所在路徑長度小于一個最大鏡面反射深度的值時歇拆,按上述方式補償。第二向楼,對于虛擬光源在生成時所在路徑為1時查吊,補償量進行多次采樣,超過1時湖蜕,補償量進行一次采樣逻卖。