目录
为什么需要光线追踪
实现软阴影
提高场景的真实感,尤其是光线不止反射一次时
基础光线追踪算法
对光的说明:
- 光沿直线传播
- 光在相交处不碰撞
- 光从光源出传播到人眼,反过来也可以,即一种"感知光线"从人眼处传播至光源(光路的可逆性)
光线的投射
- 从人眼放出“感知光线”,透过投影平面上的像素投射到虚拟世界上的某一点
- 从这点向光源连一条线,检查该点是否在光照范围内
Recursive (Whitted-Style) Ray Tracing
从人眼发出一条“感知光线”,与玻璃球相交,可以发生镜面反射和折射。
反射光线和折射光线与物体再次相交,从这些物体都连接一条到光源的线。
分别计算光线与物体相交的所有点(下图4个黑点)处的着色,相加就得到了最开始“感知光线”第一个相交点的着色。
Ray-Surface相交计算
射线定义
表面形状定义
球体定义为 ( p − c ) 2 − R 2 = 0 (p-c)^2-R^2=0 (p−c)2−R2=0,其中p为球上的点,c为秋心点,R为半径。
其他平面可以隐式定义为 f ( p ) = 0 f(p)=0 f(p)=0
相交计算
射线与球体的相交: ( o + t d − c ) 2 − R 2 = 0 (o+td-c)^2-R^2=0 (o+td−c)2−R2=0
射线与任意平面的相交: f ( o + t d ) = 0 f(o+td)=0 f(o+td)=0
射线与三角面片的相交
- 先计算射线与三角面片所在的面的交点
- 再计算交点是否在三角形内
面的定义
使用面的法线和面上一点可以定义一个平面: ( p − p ′ ) ⋅ N = 0 (p-p')·N=0 (p−p′)⋅N=0
射线与面的相交
Möller Trumbore Algorithm
使用三角形的重心坐标
那么线与三角形的交点可以直接计算
Accelerating Ray-Surface相交计算
大场景中的三角形面片很多,计算一条射线与所有三角面片是否相交不合理,计算量太大,因此引入了包围盒的概念。
为了计算简单,使用轴对齐包围盒(Axis-Aligned Bounding Box, AABB)
轴对齐包围盒
包围盒可视为由三个对面围城的一个立方体,轴对齐包围盒的轴与坐标轴是平行的。
若光线与包围盒不相交,则包围盒中的物体与光线必不相交。
射线与AABB的交点
以二维为例:
- 求直线在x=x0和x=x1上的交点,直线在这对面范围内被标记为红色线段
- 求直线在y=y0和y=y1上的交点
- 则两个红色线段的交集是直线在包围盒内的范围
在三维中,对三个对面分别做以上操作,则直线在包围盒内的t为
因为我们要求射线与包围盒的交点,射线的t必须是大于0的。
满足下列条件,则射线与包围盒相交
为什么使用AABB
为了计算简便。图中:
- 上面的是射线与任意平面交点的计算。
- 下面是射线与平行于y-z面的平面的交点计算,只需要计算x分量即可。