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