光线追踪
为什么需要光线追踪
光栅化
难以做全局光照、不好做软阴影,glossy refection、难以处理间接光照、虽然计算速度快但是效果差。
光线追踪
慢、质量高。
光线
- 光线沿直线传播
- 光线不会发生碰撞
- 光线从光源到人眼里,光路具有可逆性。
光线投射
发生多次折射Whitted-Style光线追踪
光线定义
光线和球的交点
根据t的值可以有三种情况,相交,相切和相离。对于所有的隐式表面都可以用同样的方法求交点,只要保证t有意义和二次方程有解。
光线和三角形网格求交
可以先求出平面和光线的交点,然后判断交点是否再三角形内。
平面可以用点法向式定义。
下面算法可以直接判断三角形和光线相交。
n=3的线性方程组,可以用克莱姆法则求解,需要判断解的正确性,t大于0,b1、b2、1-b1-b2都在0到1之间。
光线和几何求交
把几何的所有三角形求交,找出距离最近的点、但是会非常慢,复杂度为像素个数 * 三角形个数 * 反射次数。
引入包围盒(Bounding Box),经常用Axis-Aligned Bounding Box(AABB)。
和包围盒求交
二维情况
三维情况
进入所有的对面才能进入盒子,从任意对面出去都会从盒子离开。
当包围盒和坐标轴平行时,计算相交时间非常快!
加速效率结构
均匀空间划分(Uniform Spatial Partition)
- 找到包围盒
- 划分网格
- 光栅化一条直线,找出所有相交的网格
- 对含有物体网格判断其物体和光线是否相交
因为对网格的相交判断速度大于对物体的求交,网格不能划分太细和太疏。
局限:对于分布不均匀的场景不太实用。
空间划分(Spatial Partition)
做光线追踪之前,提前建立好KD-Tree,KD-Tree存储如下
局限:aabb和三角形的求交不好判断、三角形可能和多个aabb有交集,会产生多次判断。
物体划分和层次包围盒(Object Partitions & Bounding Volume Hierarchy)
BVH存储如下