版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tinyzhao/article/details/54427561
光线追踪是一种经典的渲染方法。
概述
光线追踪算法假设光线从眼睛出发,追踪光线的路径,由此找到对应像素的信息。
光线生成
投影
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 #没有和物体相交返回背景光