【Ray Tracing】光线追踪(2) KD树-二分查找

课程来源:GAMES101-现代计算机图形学入门-闫令琪 Lecture14
GAMES101 现代计算机图形学入门
主讲老师:闫令琪,UCSB
课程主页:https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html

Uniform Spatial Partitions 均匀空间划分

Preprocess – Build Acceleration Grid 预处理-构建加速网格

  • 寻找包围盒
    在这里插入图片描述

  • 划分成格子
    在这里插入图片描述

  • 将每个对象存储在重叠的单元格中
    在这里插入图片描述

  • 按光线遍历的顺序逐步穿过网格

  • 对于每个网格单元格,测试与存储在该单元格中的所有对象的交集

  • 当光线与格子有交点时,判断格子内是否有物体,如果有,判断光线是否与格子内的物体相交,如果没有,那么不做判断。当光线和格子内的物体相交,查找结束。

  • 光线经过第一个格子,如何求得下一个光要经过格子是什么呢?

  • 由于光是往右上打的,那么下一个格子一定是往右或者上的格子。

  • 2d的这个原理,也可以推导到3d去。
    在这里插入图片描述

  • 这个方法加速效果如何?

  • 一个格子,完全没有效率提升。
    在这里插入图片描述

  • 划分了太多格子,效率下降。
    在这里插入图片描述

  • 在中间找到一个平衡点……
    在这里插入图片描述

  • 但是当场景不同时,尤其是物体大规模集中,又大规模空白时,就很难处理了。
    在这里插入图片描述

  • 那么,在同一个空间里,用不同的方法划分呢?

Spatial Partitioning Examples 空间划分示例

  • 八叉树
    八叉树在划分到某个格子内没有物体时,就没必要划分了(如果划分,会造成性能损耗)。
  • KD树——和维度没有关系
    每次KD树找到一个东西,那么它会沿着某个轴(水平的或者竖直的),砍一刀。水平一次,竖直一次,就能基本均匀地划分,并且是一种二叉树。(在三维,就是沿着x砍一刀,再沿着y砍一刀,再沿着z砍一刀,再沿着x……)
  • BSP树
    BSP树是一种二分的方法,每次选择一个方向砍,但这样会破坏它的AABB结构。
    在这里插入图片描述

KD Tree Pre-Processing – KD树预处理

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 总结
    在这里插入图片描述

Traversing a KD-Tree

在这里插入图片描述

  • 判定是否和A有交点,有。考虑和它的子节点是否也有交点,并且和A里所有的物体求交点。(当光线和父节点没有交点时,那么就不可能和它的子节点有交点)
  • 理论上左边的区域也是要继续划分的,但是我们按照规则来,就不划分它了。
  • 和A的子节点,右边区域(B)求交点,有。再和它的子节点求交点。
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 用这种方法一直找,找到叶子结点的交点,那么就该求交点了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值