【GAMES101】Ray Tracing
光栅化是一种很快的做法,可以做到实时,但是质量较低。光线追踪是一种精确的算法,但是生成的过程很慢,通常作离线算法。
光线追踪
光线追踪的三点假设
光沿直线传播;
光线与光线直接不会发生“碰撞”;
光线的可逆性:光源发射的光线经过反射进入眼睛;也可以认为眼睛发出“感知光线”打到光源上。
Recursive(Whitted-Style) Ray Tracing
假设了光线的反射和折射;对每次折射或者反射的弹射点都计算一次着色。将所有着色加权然后叠加,最终得到像素平面上的颜色。
求光线与表面交点
一条光线可以用一个点和方向表示为:
图形学常用三角形表示物体表面,因此求交问题转化为求解光线与三角形的交点,思路是先求解光线和平面的交点,再判断交点是否在三角形内部。
平面的方程为:
联立可以解得:
注意尽管是任意选取的平面上的点,分子上的内积结果是不受位置影响的。
Möller-Trumbore算法可以快速求解三维空间中光线与三角形的交点(也能判断是否有交点、交点是否在三角形内)。
加速光线求交
光线与轴对齐包围盒(AABB)求交
三维的轴对齐包围盒(Axis-Aligned Bounding Box, AABB)
是一个长方体,其六个面都与坐标轴平行且能够刚好包裹住物体。加速光线与物体求交的一个自然想法是,先判断光线是否与物体的AABB相交,如果不相交则光线不可能与物体相交。
求解光线与AABB的交点的例子(这里用二维情况举例)如下:
分别计算光线进入、离开每一对面(在这个二维例子中是一对边,例如直线和)的时间;
光线进入所有对面(对边)才算进入AABB,离开任一对面(对边)都算离开AABB;
因此计算出对于整个AABB,有、;
当且仅当且时,光线与AABB相交。