在利用輻照度緩存機制實現(xiàn)的光線追蹤算法中,渲染點的輸出計算和輻照度緩存更新是相互關(guān)聯(lián),交替進行的。下面首先介紹渲染點的輸出計算部分。
計算某渲染點的輸出需要計算四部分光線的作用。在計算這三部分光線作用前,根據(jù)由渲染點發(fā)出的光線對象及相交物體對象,計算交點處的坐標、法線和BSDF。接下來計算上述四部分內(nèi)容。第一,根據(jù)光線方向計算交點處自發(fā)光的輻照度。第二,按照直接光照模型的算法,計算交點處直接由場景中全部光照產(chǎn)生的作用效果。第三,計算交點處由鏡面反射或透射形式的間接光照所產(chǎn)生的作用效果。第四,計算漫散射形式的間接光照所產(chǎn)生的作用效果。輻照度緩存機制即在該部分發(fā)揮作用。該部分計算實際上也是分兩部分進行,第一部分是漫反射和光澤反射形式的間接光照,第二部分是類似漫反射和光澤反射的透射形式的間接光照。在完成這兩部分前,首先確保法線方向與出射光線方向在平面的一側(cè),其次估算了相鄰像素間隔在世界坐標系中的距離。該結(jié)果將用于判斷是直接計算還是利用緩存進行計算。實際計算該距離時,是通過對交點處微分幾何體兩個方向的分量構(gòu)成的平行四邊形的面積開平方得到。如果兩個方向的分量相互垂直且長度相等,則得到的是正方形的邊長。
下面在介紹計算漫散射形式的間接光照所產(chǎn)生的作用效果前,先介紹如何利用八叉樹實現(xiàn)緩存中各點輻照度數(shù)據(jù)的快速查找和插值。在八叉樹的數(shù)據(jù)結(jié)構(gòu)中存儲著已緩存輻照度數(shù)據(jù)的坐標點的包圍盒信息。在利用八叉樹進行快速查找前,需要提供待查找點的坐標和一個重載了括號操作符的對象。查找時,八叉樹會判斷查找點是否存在于某個包圍盒中,凡是存在就會提供包圍盒對應(yīng)點采樣信息包括的坐標,法線,輻照度和平均入射方向信息,并調(diào)用這個對象,執(zhí)行相應(yīng)的操作。這里所執(zhí)行的操作主要就是判斷該點是否用于后續(xù)計算。判斷方式是定義兩個偏差函數(shù),一個是兩點距離與預(yù)設(shè)最大距離之比,另一個是1減去兩點法線余弦夾角的結(jié)果與預(yù)設(shè)最大結(jié)果之比的平方根。兩個偏差函數(shù)取最大后作為最終的偏差。當該偏差小于1時,使用該點的輻照度數(shù)據(jù),且輻照度和平均入射角度均進行加權(quán),權(quán)重為1減去偏差,并且還單獨對權(quán)重進行累加。完成八叉樹中所有點的遍歷后,返回累加的平均入射方向和加權(quán)平均處理后的輻照度。另外,返回這兩個結(jié)果前,還需要累加的權(quán)重大于一個預(yù)設(shè)的權(quán)重最小值,否則查找失敗,不返回這兩個數(shù)據(jù)。
完成前述的查找和差值工作后,就可以計算漫散射形式的間接光照所產(chǎn)生的作用效果了。計算方法并不復(fù)雜,將平均入射方向作為入射方向后,該點的BSDF值乘以前面得到的輻照度值就得到了該點的輸出。此時相當于把其他點的輻照度信息轉(zhuǎn)換為一個有向光源。對于全漫反射表面,該方法與按入射光線概率分布計算得到的結(jié)果不存在偏差。對于有光澤的反射表面,按照書中的說法,該方法比按均勻入射得到的結(jié)果要好。
下面介紹輻照度緩存更新部分。這里需要說明的一點是,只有無法利用緩存計算,而直接計算的輻照度信息才會被存儲到輻照度緩存中。計算輻照度需要對該點的入射輻亮度和入射方向的余弦的乘積關(guān)于立體角的積分。由于很難找到與該乘積形狀相同的入射方向分布函數(shù),所以使用蒙特卡羅積分時,入射光線采用余弦半球加權(quán)分布,且采樣所需的二維隨機變量采用低偏差序列生成。此外,產(chǎn)生的入射光線是在反射點的BSDF對應(yīng)的局部坐標系中滿足余弦半球加權(quán)分布,因而采樣產(chǎn)生的光線還需要變換到世界坐標系中。光線生成后,采用路徑積分器進行計算。每次計算結(jié)束后,將光線的輻亮度和方向進行累加。對產(chǎn)生的所有光線,還需要計算其長度的最小值。該最小值的一半按屏幕坐標系轉(zhuǎn)換到世界坐標系的一個距離下限變量和距離上限變量取限幅后,作為該點的包圍盒邊長的一半。將該包圍盒以及該點的輻亮度和平均入射光線方向信息加入到輻照度緩存中,就完成了更新過程。由八叉樹的算法可知,該包圍盒的范圍也就決定了該緩存值能夠使用的點的范圍。