光線追蹤是一種經典的渲染方法。
概述
光線追蹤算法假設光線從眼睛出發,追蹤光線的路徑,由此找到對應像素的信息。
光線生成
投影
3D場景到2D圖像的轉變有不同的投影方式,主要有平行投影和透視投影。其中透視投影和人眼的視覺特點一致。
光線
在透視投影中,光線的原點是人眼位置,方向爲從眼睛到每個像素的方向。
交點
從眼睛發出的光線需要計算和場景中物體的交點。主要有線與球的交點,線和三角形的交點。其中線和三角形的交點比較常用。這一步的做法是聯立方程組,求解交點座標。
着色
在着色這一步主要考慮有光,陰影和鏡面反射。
光
光由三部分組成:環境光,漫反射光和鏡面反射光。
因此在每個頂點處需要記錄紋理顏色
陰影
從交點處和光源連線,如果中間有遮擋,那麼這裏就是陰影。
鏡面反射
鏡面反射的解決方法是遞歸調用,反覆尋找上一個交點。
僞代碼
function raycolor( ray e + td, real t0, real t1 ) #求某個像素着色
hit-record rec, srec
if (scene→hit(e + td, t0, t1, rec)) then #視線與物體相交
p = e + (rec.t) d
color c = rec.ka Ia #環境光
if (not scene→hit(p + sl,epsilon, ∞, srec)) then #不是陰影
vector3 h = normalized(normalized(l) + normalized(−d))
c = c + rec.kd I max (0, rec.n · l) + (rec.ks) I (rec.n · h)rec.p
return c #出現陰影就返回環境光
else
return background-color #沒有和物體相交返回背景光