Lec13 Ray Tracing (Whitted-Style Ray Tracing)光线追踪
- 为什么需要光线追踪
-
光栅化的问题(不是很好去表示全局的效果)
- soft shadows
- Glossy reflection (物体表面反射)
- indirect illumination (间接光照(光线在到达人眼前弹射不止一次))
-
光线追踪很精确,但是非常慢(通常用来制作电影)
- 1帧 需要 10k CPU 一核小时
-
基础光线追踪算法
- 什么是光线(图形学里的假设)
- 光线是沿直线传播的
- 光线与光线间不会发生碰撞
- 一定是从光源被发出来,经过一系列的反射折射达到人眼(摄像机)reciprocity (光线是可逆的)
- “当你凝视深渊的时候,深渊也在凝视你”
- 利用光线的可逆性
- 从相机出发,穿过每一个像素,发出一条光线,打到场景里的一个点
- 如果这个点不在阴影里,就是一条有用的通路
- Pinhole Camera Model
- 每一个像素,投出一根线
- 与场景相交,找最近交点
- 连线光源,形成第二条光线,看点对光源是否可见
- 算着色,写回像素值
Whitted-Style Ray Tracing
-
与之前的不同的是,光线打到(类似玻璃的)物体,一部分能量反射一另部分折射
-
着色也有变化,每一个点都和光源连线做着色,如果能连线都都加起来给这个像素
技术问题
-
求交点
-
隐式
-
光线被定义成,一个起点,一个方向向量
-
对于光线上的任意一个点,都能用 o + td 表示(t是时间)
-
-
r ( t ) = o + t d r(t) = o + td r(t)=o+td
-
球的定义
- P : ( p − c ) 2 − R 2 = 0 P: (p-c)^2-R^2 = 0 P:(p−c)2−R2=0
- 到球心距离为半径的每一点
-
与球的交点
-
( o + t d − c ) 2 − R 2 = 0 (o + td - c)^2-R^2 = 0 (o+td−c)2−R2=0
-
联立方程,通过求根公式求根
-
-
-
-
推广,光线与一般隐式表面的求交,都用方程求解
- 不过根需要是实数,需要是正数(因为光是射线)
-
-
和显式表面求交
- 如果点在任意多边形内,从这个点向外做射线,交点个数必为奇数
- 和三角形面
-
光线和平面求交
-
点是否在三角形内
-
定义平面
- 法线 N 和一个在平面内的点 p’
- $P:(p-p’) ·N = 0 $
-
又是既在平面上又在光线上
-
-
是否在三角形内
-
Moller Trumbore Algorithm(MT算法)
-
利用做重心坐标必在三角形内
-
-
求出来 ( 1 − b 1 − b 2 ) , b 1 , b 2 (1-b_1-b_2),b_1,b_2 (1−b1−b2),b1,b2都得是非负的
-
-
- 加速光线与表面求交
- 缺陷:太慢了 像素数 * 三角形数
- Bouding Volumes(包围盒)
- 用长方体
- 是三个相对的对面形成的空间交集
- Axis-Aligned Bounding Box (AABB) 轴对齐包围盒
- 是不是和盒子有交点
-
-
光线需要进入了三对面才是进入了包围盒
-
光线只要出了一对面就是除了包围盒
-
t e n t e r = m a x { t m i n } , t e x i t = { t m a x } t_{enter} = max\{t_{min}\}, t_{exit} = \{t_{max}\} tenter=max{tmin},texit={tmax}
-
如果进入时间小于离开时间就是有交点
-
fl如果 t e x i t < 0 t_{exit} < 0 texit<0,那么盒子在光线背后
-
如果 t e x i t > = 0 a n d t e n t e r < 0 t_{exit} >=0 and t_{enter} < 0 texit>=0andtenter<0,那么光源在盒子里,肯定有交点
-
总结
-
t e n t e r < t e x i t a n d t e x i t > = 0 t_{enter}< t_{exit} and t_{exit} >= 0 tenter<texitandtexit>=0,光线与AABB有交点
-
要用Axis-Aligned的包围盒,能够简便计算
- 对比:
-
-