本页目录

【GAMES101】Ray Tracing

光栅化是一种很快的做法,可以做到实时,但是质量较低。光线追踪是一种精确的算法,但是生成的过程很慢,通常作离线算法。

光线追踪

光线追踪的三点假设

光沿直线传播;

光线与光线直接不会发生“碰撞”;

光线的可逆性:光源发射的光线经过反射进入眼睛;也可以认为眼睛发出“感知光线”打到光源上。

Recursive(Whitted-Style) Ray Tracing

img

假设了光线的反射和折射;对每次折射或者反射的弹射点都计算一次着色。将所有着色加权然后叠加,最终得到像素平面上的颜色。

求光线与表面交点

一条光线可以用一个点和方向表示为:

图形学常用三角形表示物体表面,因此求交问题转化为求解光线与三角形的交点,思路是先求解光线和平面的交点,再判断交点是否在三角形内部。

img

平面的方程为:

联立可以解得:

注意尽管是任意选取的平面上的点,分子上的内积结果是不受位置影响的。

Möller-Trumbore算法可以快速求解三维空间中光线与三角形的交点(也能判断是否有交点、交点是否在三角形内)。

加速光线求交

光线与轴对齐包围盒(AABB)求交

三维的轴对齐包围盒(Axis-Aligned Bounding Box, AABB)是一个长方体,其六个面都与坐标轴平行且能够刚好包裹住物体。加速光线与物体求交的一个自然想法是,先判断光线是否与物体的AABB相交,如果不相交则光线不可能与物体相交。

求解光线与AABB的交点的例子(这里用二维情况举例)如下:

img

分别计算光线进入、离开每一对面(在这个二维例子中是一对边,例如直线)的时间;

光线进入所有对面(对边)才算进入AABB,离开任一对面(对边)都算离开AABB;
因此计算出对于整个AABB,有

当且仅当时,光线与AABB相交。

使用AABB加速光线求交