在利用輻照度緩存機制實現(xiàn)的光線追蹤算法中瑟押,渲染點的輸出計算和輻照度緩存更新是相互關聯(lián),交替進行的星掰。下面首先介紹渲染點的輸出計算部分多望。
計算某渲染點的輸出需要計算四部分光線的作用。在計算這三部分光線作用前氢烘,根據由渲染點發(fā)出的光線對象及相交物體對象怀偷,計算交點處的坐標、法線和BSDF播玖。接下來計算上述四部分內容椎工。第一,根據光線方向計算交點處自發(fā)光的輻照度蜀踏。第二维蒙,按照直接光照模型的算法,計算交點處直接由場景中全部光照產生的作用效果果覆。第三颅痊,計算交點處由鏡面反射或透射形式的間接光照所產生的作用效果。第四局待,計算漫散射形式的間接光照所產生的作用效果斑响。輻照度緩存機制即在該部分發(fā)揮作用。該部分計算實際上也是分兩部分進行钳榨,第一部分是漫反射和光澤反射形式的間接光照舰罚,第二部分是類似漫反射和光澤反射的透射形式的間接光照。在完成這兩部分前薛耻,首先確保法線方向與出射光線方向在平面的一側营罢,其次估算了相鄰像素間隔在世界坐標系中的距離。該結果將用于判斷是直接計算還是利用緩存進行計算饼齿。實際計算該距離時愤钾,是通過對交點處微分幾何體兩個方向的分量構成的平行四邊形的面積開平方得到。如果兩個方向的分量相互垂直且長度相等候醒,則得到的是正方形的邊長能颁。
下面在介紹計算漫散射形式的間接光照所產生的作用效果前,先介紹如何利用八叉樹實現(xiàn)緩存中各點輻照度數據的快速查找和插值倒淫。在八叉樹的數據結構中存儲著已緩存輻照度數據的坐標點的包圍盒信息伙菊。在利用八叉樹進行快速查找前,需要提供待查找點的坐標和一個重載了括號操作符的對象。查找時镜硕,八叉樹會判斷查找點是否存在于某個包圍盒中运翼,凡是存在就會提供包圍盒對應點采樣信息包括的坐標,法線兴枯,輻照度和平均入射方向信息血淌,并調用這個對象,執(zhí)行相應的操作财剖。這里所執(zhí)行的操作主要就是判斷該點是否用于后續(xù)計算悠夯。判斷方式是定義兩個偏差函數,一個是兩點距離與預設最大距離之比躺坟,另一個是1減去兩點法線余弦夾角的結果與預設最大結果之比的平方根沦补。兩個偏差函數取最大后作為最終的偏差。當該偏差小于1時咪橙,使用該點的輻照度數據夕膀,且輻照度和平均入射角度均進行加權,權重為1減去偏差美侦,并且還單獨對權重進行累加产舞。完成八叉樹中所有點的遍歷后,返回累加的平均入射方向和加權平均處理后的輻照度菠剩。另外庞瘸,返回這兩個結果前,還需要累加的權重大于一個預設的權重最小值赠叼,否則查找失敗擦囊,不返回這兩個數據。
完成前述的查找和差值工作后嘴办,就可以計算漫散射形式的間接光照所產生的作用效果了瞬场。計算方法并不復雜,將平均入射方向作為入射方向后涧郊,該點的BSDF值乘以前面得到的輻照度值就得到了該點的輸出贯被。此時相當于把其他點的輻照度信息轉換為一個有向光源。對于全漫反射表面妆艘,該方法與按入射光線概率分布計算得到的結果不存在偏差彤灶。對于有光澤的反射表面,按照書中的說法批旺,該方法比按均勻入射得到的結果要好幌陕。
下面介紹輻照度緩存更新部分。這里需要說明的一點是汽煮,只有無法利用緩存計算搏熄,而直接計算的輻照度信息才會被存儲到輻照度緩存中棚唆。計算輻照度需要對該點的入射輻亮度和入射方向的余弦的乘積關于立體角的積分。由于很難找到與該乘積形狀相同的入射方向分布函數心例,所以使用蒙特卡羅積分時宵凌,入射光線采用余弦半球加權分布,且采樣所需的二維隨機變量采用低偏差序列生成止后。此外瞎惫,產生的入射光線是在反射點的BSDF對應的局部坐標系中滿足余弦半球加權分布,因而采樣產生的光線還需要變換到世界坐標系中译株。光線生成后瓜喇,采用路徑積分器進行計算。每次計算結束后古戴,將光線的輻亮度和方向進行累加欠橘。對產生的所有光線矩肩,還需要計算其長度的最小值现恼。該最小值的一半按屏幕坐標系轉換到世界坐標系的一個距離下限變量和距離上限變量取限幅后,作為該點的包圍盒邊長的一半黍檩。將該包圍盒以及該點的輻亮度和平均入射光線方向信息加入到輻照度緩存中叉袍,就完成了更新過程。由八叉樹的算法可知刽酱,該包圍盒的范圍也就決定了該緩存值能夠使用的點的范圍喳逛。