簡介:
在計(jì)算機(jī)圖形學(xué)領(lǐng)域,這技術(shù)被普遍應(yīng)用于生成高質(zhì)量的照片級圖像,在為一個(gè)場景計(jì)算光照的時(shí)候,通過固定管線就可以計(jì)算phong光照模型,由于該模型的特征,使得渲染的物體看起來有塑料得感覺,如果要渲染一個(gè)有金屬質(zhì)感的且能反射出周圍環(huán)境的物體,phong模型就無能為力了。和固定渲染管線相比,可編程圖形渲染管線的能力要強(qiáng)得多,雖然固定管線里面可以用環(huán)境貼圖來實(shí)現(xiàn)物體對環(huán)境的反射效果,但這種環(huán)境只能反射出已經(jīng)保存在cube map的中貼圖,在真實(shí)世界中,如果能反射出周圍環(huán)境的物體還有很多其他物體,他們就會(huì)互相反射,一般環(huán)境貼圖技術(shù)大達(dá)不到這種效果,這就要用到光線追蹤技術(shù)。
光線跟蹤是一種多功能技術(shù),它可以用同一模型來模擬光源和環(huán)境入射光在物體表面產(chǎn)生的鏡面反射和折射、實(shí)現(xiàn)場景的消隱及生成陰影等,同時(shí),也可以用作體繪制(volue rendering)的基礎(chǔ).
光線跟蹤算法由于需要跟蹤每一條從視點(diǎn)出發(fā)的光線,因而涉及到大量的光線與景物的求交計(jì)算,與傳統(tǒng)的掃描線算法相比,光線跟蹤算法所需的計(jì)算量顯得很龐大,所以必須提高光線與景物的求交測試效率,器途徑有兩個(gè):一個(gè)是提高光線與景物的求交計(jì)算效率,例如光線跟蹤參數(shù)去面片、光線跟蹤代數(shù)去面片、光線跟蹤分維曲面等,這些算法針對具體曲面特點(diǎn)改善了求交的數(shù)學(xué)方法,減少了求交的計(jì)算量;另一個(gè)途徑是快速確定光線與景物是否有交,這一方法已成為加速光線跟蹤的主流技術(shù),主要有:包圍盒算法和空間剖分算法.
基本算法:
在光線跟蹤系統(tǒng)中,物體空間中一點(diǎn)被取作試點(diǎn),一個(gè)與視點(diǎn)位置適當(dāng)?shù)钠矫婢匦螀^(qū)域被取作投影屏幕,為了簡化計(jì)算,常把視點(diǎn)取在Z軸上,并取xoy平面作為投影屏幕,投影屏幕用兩組相互垂直的平行線分成若干個(gè)小方格,每個(gè)小方格對應(yīng)于屏幕的一個(gè)像素,常取小方格中心為取樣點(diǎn)
圖形生成時(shí)通過對每個(gè)像素分別計(jì)算顏色亮度來進(jìn)行的。首先,從視點(diǎn)出發(fā),引出一條視線穿過取樣點(diǎn),像物體空間延伸,通過計(jì)算求得與它相交的物體。視線可能與多個(gè)物體相交,存在多個(gè)交點(diǎn)。可以通過比較各個(gè)點(diǎn)與視點(diǎn)的距離,求得離視點(diǎn)的最近點(diǎn)。改點(diǎn)稱為在視點(diǎn)方向上相對于視點(diǎn)的可見點(diǎn)。可見點(diǎn)除的法向量必須計(jì)算出來,以滿足后面的計(jì)算需求。法向量計(jì)算出來以后,通過查找表面數(shù)據(jù)表,獲得表面的顏色屬性,反射率,透明性與粗超程度等,就可以可以使用光照模型公式來計(jì)算可見點(diǎn)的發(fā)射強(qiáng)度。然后在此計(jì)算之前,首先要判斷可見點(diǎn)是否處于陰影中。判斷的方法是從改點(diǎn)想光源引射線,看射線是否與某不透明的物體相交。
如果物體比較光滑,反射性比較強(qiáng),那么其他物體可以通過可見點(diǎn)反射或者折射到達(dá)視點(diǎn),對于這類表面,我們在求得可見以后,必須沿反射線方向繼續(xù)跟蹤,看看在反射線或者折射線方向上是否有物體存在,,這種射線稱為間接事先,當(dāng)間接視線與物體相交時(shí),確定離可視點(diǎn)最近的交點(diǎn),稱為間接可視點(diǎn),它對可見點(diǎn)的光強(qiáng)度可以計(jì)算出來,在間接可見點(diǎn)可能又需要從反射或者折射方向跟蹤視線。在這個(gè)過程中實(shí)際上是一個(gè)遞歸過程。所以光線跟蹤本質(zhì)上是一個(gè)遞歸算法,每個(gè)像素的顏色與光強(qiáng)必須綜合各級遞歸計(jì)算的結(jié)果才能獲得
R
aytracing(start_point,view_direction,wright,color){
/*start_point:在第一次調(diào)用表示視點(diǎn),以后各級遞歸用于表示可見點(diǎn)
view_direction;視線方向,與光傳播方向相反
weight: 當(dāng)前點(diǎn)光強(qiáng)計(jì)算結(jié)果的貢獻(xiàn)比例值,當(dāng)它小于閥值Minweight時(shí),將被認(rèn)為對最終計(jì)算結(jié)果影響很小,可忽略不計(jì)
color;返回值*/
if(wight<Minweight)
color=blank;
else{
if(無交點(diǎn))
color=blank;
else{
Io=交點(diǎn)出光照模型值;
計(jì)算反射方向R
Raytracing(交點(diǎn),R,weight * Wr,Ir);
計(jì)算折射方向T;
Raytracing(交點(diǎn),T,weight *Wr,It);
color=Io+Ir+It;
}
}
}
雖然在理想情況下,光線可以在物體之間進(jìn)行無線的反射與折射,但是實(shí)際的算法進(jìn)行過程中,我們不可能進(jìn)行無窮的光線跟蹤,給出幾種終止條件:
1>該光線未碰到任何物體
2>該光光線碰到了背景
3>光線在經(jīng)過許多次反射和折射以后,就會(huì)產(chǎn)生衰減,光線對于視點(diǎn)的光強(qiáng)的貢獻(xiàn)值很小(小于某個(gè)設(shè)定值)
4>光線反射與折射次數(shù)即跟蹤深度大于一定值
光線與物體求交: