01 - Whitted-Style光线追踪

光追与光栅化

光线追踪和光栅化是两种不同的成像方式:

  • 光栅化虽然快,但质量相对较低,且无法解决一些全局效果,比如间接光照:

    不仅要考虑直接光源,还要考虑从地板反射的光等,而光线追踪正是为了解决这种问题所提出的一种考虑全局效果的光照模型。

  • 光线追踪虽然很准确,但是很慢(离线渲染)。

光线

规定

对光线做如下规定:

  • 光线一定沿着直线传播
  • 光线之间无法碰撞
  • 光线从光源发出,经过若干流程(反射、折射等)最终到达人眼/摄像头;当然也能逆着来(光路可逆)

定义

只需要定义光源的位置、光线的方向以及光线行进的长度即可:

光追流程

光线投射(Ray Casting)

前提:认为人眼/摄像机都是针孔的。

首先,从这里向近投影平面上每一个像素点发射一条光线(Eye Ray),取与最近物体相交的交点:

然后,将其与光源连接,成为Shadow Ray(即下图的虚线),判断该点是否在阴影中很简单,只需判断Shadow Ray间是否有物体存在即可。然后,可以利用Blinn-Phong模型对该着色点进行局部光照模型计算,得到该像素的颜色:

这里得到的结果跟前边的局部光照模型差不多,因此,为了考虑全局效果,得进行光线追踪。

递归Whitted-Style光追

假设上图的球体是透明玻璃材质的,那必然会发生光线的反射与折射。眼睛发出的光(Primary Ray)经过折射/反射,发生一些能量损失,并生成Secondary Rays。计算这些着色点的局部光照模型结果,综合到近投影平面的像素点上:

涉及到的技术

求光线和物体表面交点

隐式曲面

以和球体表面的交点为例:

由此可知,应该既在光线上,也在球面上,因此有 利用求根公式可以求出交点:

并且根据的正负关系,可以判断有几个交点。

综上,求光线和隐式曲面的交点,可总结如下:

显式曲面

以和三角形面的交点为例:

可以分解为两个小问题,求出光线与三角形所在平面的交点,再判断点是否在三角形内即可。

知道平面的法线,和平面上一点,即可定义一个平面:

接下来求光线与平面的交点,将平面方程和光线方程联立即可:

最后,利用MT算法(Moller Trumbore),将点用重心坐标来表示,用克莱姆法则求解线性方程组即可:

算下来的结果得是非负的。

参考资料

  • GAMES101-现代计算机图形学入门
  • 计算机图形学十二:Whitted-Style光线追踪原理详解及实现细节 - 知乎 (zhihu.com)