# 实现思路 Whitted-Style
以摄象机为起点,向成像平面发射射线(Ray),透过成像平面所被分成的像素打在最近的模型的点上,并将该点与光源连接,即已知入射方向,观察方向,法线方向,可以着色,并写回像素
加上光线的反射和折射和能量损失
可以一直递归下去
听上去很简单,但实际上一点也不简单
我们将光线的方程定义为一个方向向量与时间 t 相乘加上一个点
光线方程和平面联立求解
但对于发射出的光线,每个像素都要发射一条光线,每条光线的每次反射都要要与场景内每一个面的方程求交
计算量极大
# 优化思路
# AABB 包围盒
给每一部分都确定一个包围盒,每个包围盒的范围要大于那一部分,如果没有经过包围盒,也就不可能与原本的那一部分有交点
而 AABB 是一种特殊的包围盒,即轴对齐包围盒,确保每一个包围盒是正的,也简化了计算
我们将每一个包围盒视作三对同向的平面
根据光线方程与六个平面联立得到的 t 的关系,可以确定光线与包围盒的各种关系
对于每一对平面,有光线未达、在内、离开三种状态的时间 t 范围
三个平面的在内 t 求交集,就是光线在包围盒内的 t
空集就是莫得交点
反之就是有了
对于包围盒的确定,我们先将场景放置在一个包围盒内,再对包围盒进行划分,划分相当于是预处理
常见方法有固定大小网格、八叉树(oct-tree)、KD-Tree
但三角形与包围盒求交并不好算,而且一个三角形可能在多个包围盒内
# Bounding Volume Hierarchy
前面的分割方式是根据空间分割
这个 BVH 是根据物体分割
分割出更为平衡的树,且不会出现一个物体出现在多个盒子的情况
# 其他
但是相比之下 Whitted-Style Ray tracing 还是不够真实
可以采用辐射度量学的内容
如使用蒙特卡洛积分法、轮盘赌算法等实现
具体例子就是路径追踪