0%

光线追踪其二

光线追踪其二

。。。继光线打中包围盒之后

光线追踪其二

需要更细节的算法来优化包围盒内的光线追踪!

 

统一空间分区(grid网格)

1.找到包围盒

2.划分网格

3.预处理——将每一个找到的对象都存在格子里面(把格子染色)

piGoNW9.png

4.遍历光线经过的“小格子”,若遍历到某些小盒子内含有物体,则在深入检测这个格子内的光线情况

piGowsx.png

最简单的遍历方法是按照光线方向来进行格子遍历,从而不需要找每一个格子

 

比较有意思的研究方向是可以算出来这种方式对算法的”加速情况“怎么样

考虑两个极端情况——只有一个格子全是格子

只有一个格子——没有加速

全是格子——遍历格子反而导致算法减速

所以肯定是在中间有个特殊值可以让算法最优

cell=C*objs

C约等于27

物体分布严重不匀的情况不使用于这个方法——足球场中的茶壶很难找到

 

空间划分

比如如上物体严重不均的情况下,可以使用空间划分来使物体分布不均的地方格子密度也不一样

 

八叉树

piGT36I.png

由于在空间当中,所以每一次都是将空间切分为八块,形如二叉树,物体分布越多的地区分的越多——如果格子内的物体小于一定程度,则停止迭代。

 

KD树

piGTatg.png

形如八叉树,但是切分规则不同,特点是每一次迭代只砍一刀,而且每一次的”刀口“都不规则。

 

BSP树

piGT0pj.png

和KD树比起来方向也不一样,缺点是与KD树比起来方向不一样所以根本不方便计算,所以常用的而且研究价值高的是KD树

 

KD树的数据结构

  • 划分的方向——x轴还是y轴还是z轴
  • 划分的位置——在这个轴上划分的地方
  • 子结点——两个子节点
  • 实际的三角形只存在叶子结点上而不是中间结点上——类似B+树

 

光线与KD树

本质上就是”只和光线相交的叶子结点“进行”不对中间结点进行操作“的二叉树查找

会发现沿着光线查找的现象和沿着二叉树进行查找的动作是一致的

难以解决的事:很难判定KD树的”刀口“是否与物体真的有交集,或者说”刀口“导致格子直接被物体包含

 

Object Partitions & Bounding Volume Hierarchy(对象分区域边界卷层次结构)——BVH

划分物体而不是空间

piG7gKI.png

核心是:递归地把物体分为几堆,重新计算包围盒

从代码层面上,每一个物体是不可能出现在不同的包围盒内——不用判定三角形与包围盒求交了

 

建立BVH的方法

  • 选择划分的尺寸
  • 要求一:选择最长的那个轴
  • 要求二:划分点在物体”中间“的位置——指数量上能平衡的点(涉及到快速选择算法)

与光线的算法和KD树差不多,不在赘述

用自己的话说一遍:检测光线射入第一次相交的结点,如果不相交,则直接退出,如果结点本身就是叶子结点,则让光线与该结点的所有物体求交,求出第一次接触的点并退出递归;如果不是叶子结点,算法返回第一次接触的结点,并递归前述过程。

 

辐射度量学

与光照强度相关的学问

在前面的学习过程中,例如布林冯模型,光照强度只看作一个简单的常数,现在就开始解析这个数的含义

Radiant flux(辐射流)

intensity(强度)

Radiant Intensity——光源发出的光线强度

irradiance(辐射)——光线汇聚到一个点上的强度

radiance(光芒)——单个光线传播中能量的度量

建议直接看英文

辐射度量学(Radiometry)的基础知识辐亮度拂面清风三点水的博客-CSDN博客

立体角定义:

piYTntU.png

面积除以距离平方,也可以得出一个球总的立体角为4🥧

立体角公式:piYTW9g.png

如果一个点光源均匀地朝四面八方射出光线,那么从任何一个方向对应的intensity=总power/4🥧