。。。继光线打中包围盒之后
光线追踪其二
需要更细节的算法来优化包围盒内的光线追踪!
统一空间分区(grid网格)
1.找到包围盒
2.划分网格
3.预处理——将每一个找到的对象都存在格子里面(把格子染色)
4.遍历光线经过的“小格子”,若遍历到某些小盒子内含有物体,则在深入检测这个格子内的光线情况
最简单的遍历方法是按照光线方向来进行格子遍历,从而不需要找每一个格子
比较有意思的研究方向是可以算出来这种方式对算法的”加速情况“怎么样
考虑两个极端情况——只有一个格子与全是格子
只有一个格子——没有加速
全是格子——遍历格子反而导致算法减速
所以肯定是在中间有个特殊值可以让算法最优
cell=C*objs
C约等于27
物体分布严重不匀的情况不使用于这个方法——足球场中的茶壶很难找到
空间划分
比如如上物体严重不均的情况下,可以使用空间划分来使物体分布不均的地方格子密度也不一样
八叉树
由于在空间当中,所以每一次都是将空间切分为八块,形如二叉树,物体分布越多的地区分的越多——如果格子内的物体小于一定程度,则停止迭代。
KD树
形如八叉树,但是切分规则不同,特点是每一次迭代只砍一刀,而且每一次的”刀口“都不规则。
BSP树
和KD树比起来方向也不一样,缺点是与KD树比起来方向不一样所以根本不方便计算,所以常用的而且研究价值高的是KD树
KD树的数据结构
- 划分的方向——x轴还是y轴还是z轴
- 划分的位置——在这个轴上划分的地方
- 子结点——两个子节点
- 实际的三角形只存在叶子结点上而不是中间结点上——类似B+树
光线与KD树
本质上就是”只和光线相交的叶子结点“进行”不对中间结点进行操作“的二叉树查找
会发现沿着光线查找的现象和沿着二叉树进行查找的动作是一致的
难以解决的事:很难判定KD树的”刀口“是否与物体真的有交集,或者说”刀口“导致格子直接被物体包含
Object Partitions & Bounding Volume Hierarchy(对象分区域边界卷层次结构)——BVH
划分物体而不是空间
核心是:递归地把物体分为几堆,重新计算包围盒
从代码层面上,每一个物体是不可能出现在不同的包围盒内——不用判定三角形与包围盒求交了
建立BVH的方法
- 选择划分的尺寸
- 要求一:选择最长的那个轴
- 要求二:划分点在物体”中间“的位置——指数量上能平衡的点(涉及到快速选择算法)
与光线的算法和KD树差不多,不在赘述
用自己的话说一遍:检测光线射入第一次相交的结点,如果不相交,则直接退出,如果结点本身就是叶子结点,则让光线与该结点的所有物体求交,求出第一次接触的点并退出递归;如果不是叶子结点,算法返回第一次接触的结点,并递归前述过程。
辐射度量学
与光照强度相关的学问
在前面的学习过程中,例如布林冯模型,光照强度只看作一个简单的常数,现在就开始解析这个数的含义
Radiant flux(辐射流)
intensity(强度)
Radiant Intensity——光源发出的光线强度
irradiance(辐射)——光线汇聚到一个点上的强度
radiance(光芒)——单个光线传播中能量的度量
建议直接看英文
辐射度量学(Radiometry)的基础知识辐亮度拂面清风三点水的博客-CSDN博客
立体角定义:
面积除以距离平方,也可以得出一个球总的立体角为4🥧
如果一个点光源均匀地朝四面八方射出光线,那么从任何一个方向对应的intensity=总power/4🥧