目录
① 从光源发出的光-----”辐射强度(Radiant Intensity)”
② 落在表面上的光-----”辐照度(Irradiance)”
③ 沿着射线传播的光-----”辐射度(Radiance)”
第十四节课 :光线追踪(Ray Tracing 2)
使用AABBs加速光线追踪, 以下为两种AABBs方法:
1.均匀空间分区(网格)
2.空间划分
均匀空间分区(网格)(Uniform Spatial Partitions(grids))
预处理-构建加速均匀网格
1. 找到包围盒
2. 创建网格
3. 将对象与格子相交的区域记录下来(涂成灰色)
小错误: 右上角有一块应该涂成灰色
4. 最后, 对光线与场景求交点
4.1 按光线遍历的顺序逐步穿过网格
4.2 对于每个网格单元,测试与存储在该单元中的所有对象是否相交
如何知道光线方向是如何遍历网格?
答: 不可能对每个网格单元都测试一次是否有交点, 可以利用光线方向判断可能经过的网格,
比如方向为↗, 则只判断当前已产生交点的网格位置的右或者上是否有交点.
对于网格的划分大小问题, 分为两个极端
①太稀疏, 导致没有产生加速效果
② 太密集, 导致要判断太多的网格是否有交点,而效率低下
于是, 有人测试出网格最佳的划分方法.
C是一个常数, objs为3d物体数量
最佳划分方法没有很大意义, 主要思想就是要适中.
优点: 网格适用于在大小和空间上均匀分布的大型对象集合
如下图:
想象一下“运动场上的茶壶”, 描述一个大规模空白的场景出现一个需要判断光线与网格交点的物体, 需要遍历很多无效的网格,造成浪费.
缺点: 不适用于大规模空白的场景
2.空间划分(Spatial Partitions)
2.1 八叉树(Oct-Tree)
下图是2D的, 所以变成了四叉树, 每次切两刀(以网格中心为原点, 往x,y轴切)
如果已经切好的网格是空的(无物体), 那么就停止该网格的继续切分两刀的操作.
缺点 :如果维度上升, 切的次数会增多同时网格数量也会增多, 导致计算量增大.
2.2 BSP-Tree
不沿着x,y轴方向划分.
缺点: 与八叉树一样, 随着维度增高, 计算量就增大
2.3 KD-Tree
划分方式和八叉树极为类似, 但是KD-Tree只砍一刀(沿着x轴或者y轴), 一般是以x轴划分一次, 再以y轴划分一次, 这样交替划分, 以确保均匀划分.如果已经切好的网格是空的(无物体), 那么就停止这个网格的继续切分一刀的操作.
给定一个场景, 先把加速结构做好(例如KD-Tree)
KD-Tree 预处理过程
① 网格划分一次(沿y轴砍了一刀)(蓝/绿)
② 再次划分(沿x轴再砍一刀)(绿色=绿色+橙色)
Ps:下图只是忽略蓝色被处理过程, 蓝色和绿色网格处理方式一致.
③ 不断划分得到最终的KD树的数据结构
内部节点存储
-分割轴:x、y或z轴
-分割位置:分割平面沿轴的坐标
-子节点:指向子节点的指针
在内部节点中不存储任何对象, 物体对象都存储在叶子节点.
叶节点存储 : 对象列表
判断是否有交点 - 实际做法:
遍历KD树(每次都记录tmin和tmax,判断是否有交点)
① 先和最大的包围盒做交点检测
判断光线是否与A包围盒有交点
发现光线与A包围盒确实有交点