英文课件看着有点慢,复习时帮助回忆
为什么需要光线追踪?
光栅化不能很好的处理全局效果的光照,especially when the light bounce more than once
光栅化很快,质量相对差,适合实时
光线追踪很精确,但是很慢,经常离线处理
关于光线的假设
直线传播,无碰撞,可逆性
光线追踪
eye ray:starts at eye and goes through pixel
reflected ray:specular reflection
refracted ray:
shading ray:弹射的点到光源的连线
primary ray:
secondary rays:reflected ray + refracted ray
Recursive(Whitted-Style) Ray Tracing
弹射的点将点的颜色加回到像素上(有能量损失)
光线和物体表面的交点
光线的表达
光线和隐函数表示的表面的求交
光线和三角形的求交
基本方法:首先光线和三角形所在平面求交,再判断交点是否在三角形内
三角形所在平面:
改进算法:MT算法
加速光线和物体(三角形面表示)的求交
包围盒
长方体包围盒:3个对面形成的交集
AABB:轴对齐包围盒
可以利用光线和包围盒求交加速光线与场景求交
光线和AABB求交
对于每个对面,光线与对面求交,可以求出一个tmin 和tmax,求取不同对面求出的线段的交集
只有当光线进入了所有的对面,光线才进入了包围盒,tenter=max{tmin}
光线离开了任意一个对面,光线就离开了包围盒,texit=min{tmax}
光线和AABB有交集,当且仅当 tenter < texit && texit>=0
时间的简化算法
利用光线和包围盒AABB求交加速光线与场景求交
均匀网格Uniform grids
基本思路:
1、找出包围盒
2、创建网格
3、在物体覆盖的网格存储物体
4、按照光线前进方向(画线,Bresenham算法)遍历网格,对于每个网格判断求交情况
网格过大:加速效果差
网格过小:网格与光线求交次数变多,效率下降
均匀网格方法适用于有很多大小和分布很均匀的物体的场景
空间划分Spatial partitions
KD-Tree:每次只切一次(水平与竖直交替),形成二叉树结构,知道每个部分中的物体数目小于某个值,物体只存储在叶子节点中
基本思路:
如果光线和这个部分没有交集,continue;
如果光线和这个部分有交集,判断光线和两个子节点是否有交集
直到光线和叶子节点判断
光线和叶子节点没有交集,continue;
光线和叶子节点有交集,光线和叶子节点中存储的物体都要求交
缺点:
1、包围盒和物体是否相交不好判断,也就是建立KD-Tree不简单
2、同一个物体可能被存储与多个叶子节点中
物体划分Object Partitions & Bounding Volume Hierarchy(BVH)
基本思想:
1、创建包围盒
2、将这些物体分成两部分,每一部分各自重新求包围盒
划分方法1:选择一个最长的维度,分成两部分
划分方法2:选择一个维度,将这些物体分成两个部分,每个部分中的物体数目差不多(在某一个轴向上,用三角形的重心代替三角形,找中间的那个三角形,可以使树尽可能平衡,快速选择算法)
3、物体数目足够小时,停止划分,物体存储在叶子节点中