white-styled光线追踪需要计算光线与每个三角形面的交点,并投影到像素上,并且还要考虑光线的反射和折射,所以,计算量很大(GPU你忍一下)
一个基本的思想就是把三维场景中的物体用一个外壳包起来,如果光线和这个外壳都没有交点,那么,必然和物体的表面也没有交点
一、AABB(Axis-Aligned Bounding Box)
普通平面计算与光线求交点计算t,需要三次减法(三个方向的坐标相减),六次乘法(两次向量点积)和一次除法
而AABB的这两个面只垂直于x轴,法线向量的后两个维度都是0,所以只需要在计算点积时,只需要考虑x方向的分量即可,所以只需要一次减法和一次除法
分别考虑xy两对儿直线,先看垂直于x轴的两条直线,穿过左边的时间为tmin,穿过右边的时间为tmax,再看垂直于y轴的两条直线,穿过下面的直线的时间为tmin,穿过上面直线的时间为tmax
这么多t,怎么甄别这么多t呢(t是负值表示反向传播)?依据有两点:1、光线穿过所有平面,才算进入AABB;2、光线离开任意平面,就算离开AABB
那么对于所有进入AABB的时间tmin来说,只要选择一个最大的tmin来表示进入的时间,就代表了此时光线已经穿过了所有平面,进入AABB;
对于所有进入AABB的时间tmax来说,只要选择一个最小的tmax来表示离开的时间,就代表了此时光线已经离开了AABB
试想一下,如果tenter小于texit,那是不是就表示光线是反向传播的(可以把最右边的那个图的光线反向传播),那么,此时光线就不会和AABB有交点
还有一种较为特殊的情况,就是texit>=0,tenter<0,那么就表示光源在AABB里面
有了AABB,就有了下面三种基于AABB对光线追踪加速的方法
二、均匀空间划分加速光线追踪
最后,根据光线的方向得到所有与光线相交的小AABB,如果该AABB中存在物体信息,那么再判断光线与物体表面的三角形网格是否相交
上述过程有一个关键点,就是将一个大的AABB具体要划分成多少小AABB,考虑两种极端情况,在下图的左上角,如果完全不划分的话,那么将不会有任何的加速效果
但是如果划分的太密集,那么得到的小AABB会太多,也会在一定程度上减缓加速的效果
所以,根据经验来看,小AABB的数量一般是一个常数乘以物体数量,而这个常数一般在27左右
因为存在划分小AABB数量多少会导致加速效果不同的问题,所以,这种加速方法如果被用来加速渲染比较空旷的场景,那么就会产生大量没有物体信息的小AABB,加速效果就不会太好
所以,这种方法一般适用于加速渲染物体分布均匀且较为密集的场景,比如下面的这种场景
参考
GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibili
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出