图形学笔记:光线追踪

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tinyzhao/article/details/54427561

光线追踪是一种经典的渲染方法。

Ray Tracing

概述

光线追踪算法假设光线从眼睛出发,追踪光线的路径,由此找到对应像素的信息。

这里写图片描述

光线生成

投影

3D场景到2D图像的转变有不同的投影方式,主要有平行投影和透视投影。其中透视投影和人眼的视觉特点一致。

这里写图片描述

光线

在透视投影中,光线的原点是人眼位置,方向为从眼睛到每个像素的方向。

这里写图片描述

交点

从眼睛发出的光线需要计算和场景中物体的交点。主要有线与球的交点,线和三角形的交点。其中线和三角形的交点比较常用。这一步的做法是联立方程组,求解交点坐标。

着色

在着色这一步主要考虑有光,阴影和镜面反射。

光由三部分组成:环境光,漫反射光和镜面反射光。

L=kaIa+kdImax(0,nl)+ksImax(0,nh)n

因此在每个顶点处需要记录纹理颜色 k 和法线方向 n

阴影

从交点处和光源连线,如果中间有遮挡,那么这里就是阴影。

镜面反射

镜面反射的解决方法是递归调用,反复寻找上一个交点。

伪代码

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 #没有和物体相交返回背景光

猜你喜欢

转载自blog.csdn.net/tinyzhao/article/details/54427561