GAMES101-现代计算机图形学学习笔记(12)
Lecture 13: Ray Tracing 1
原课程视频链接以及官网
b站视频链接: link.
课程官网链接: link.
光线追踪
为什么需要光线追踪?
这里常用之对比的是光栅化。光栅化是把场景中的物体独立出来,并且再将物体独立成一个个的三角形面片进行渲染,通常 GPU 绘制三角形面片是并行的,所以对于物体来说,它是不知道自己周围的物体,同样的,对于三角形面片来说,它也是不知道自己周围的三角形。所以光栅化无法处理一类需要全局信息进行渲染的效果,如:软阴影、Glossy 反射以及间接照明:
相比较光栅化,光线追踪是从相机出发,计算相机发出的光线(视线)与场景产生的结果,这里的光线可能会与场景中的物体碰撞后生成另外一些光线,然后生成的光线也需要继续做计算。所以对于光线追踪来说,相机产生的光线是知道整个场景信息的。
光栅化与光线追踪的对比:
- 光栅化快,实时,是一种近似算法
- 光纤追踪慢,离线,是一种准确的算法
光线
光线追踪需要光线的概念,课程以三个假设引入了光线的概念:
- 光线沿着直线传播
- 光线之间不会碰撞
- 光线的可逆性。光线在场景中传播,产生反弹,假设反弹至相机,那么从相机视角来看,一定可以沿着传播的路径找到光源位置
光线投射(Ray Casting)
光线投射的过程如下:
- 从相机位置,向物体投射一条光线用于成像
- 从像素中对应物体的每个位置投射回光线,检查是否在阴影中
(类似 Shadow Mapping)
常规的着色过程
从视点发射一条光线,通过成像平面(某个像素)投射至物体,然后从物体发出光线至光源检查其是否在阴影中,如果不在阴影中,就可以通过某些着色方案对这个像素进行着色,如 Blinn Phong 等。
不同于常规的着色过程,课程介绍了一种递归的光线追踪方法( R e c u r s i v e ( W h i t t e d − S t y l e ) R a y T r a c i n g Recursive (Whitted-Style) Ray Tracing Recursive(Whitted−Style)RayTracing ),下面详细介绍一下这种方法。
Recursive (Whitted-Style) Ray Tracing
该方法有几点不同于常规的着色方案:
- 光源:光线不同,这里假设光线在碰撞到物体后还会产生折射和反射。
- 着色过程:每发生一次折射或者反射(弹射点)都计算一次着色,前提是该点不在阴影内。
如图所示,该算法的过程如下:
- 从视点从成像平面发出光线,检测是否与物体碰撞
- 碰撞后生成折射和反射部分
- 递归计算生成的光线
- 所有弹射点都与光源计算一次着色,前提是该弹射点能被光源看见
- 将所有着色通过某种加权叠加起来,得到最终成像平面上的像素的颜色
为了后续说明方便,课程定义了一些概念:
从视角出发第一次打到物体的光线叫做:primary ray
一次弹射之后的光线叫做:secondary rays
判断可见性的光线叫做:shadow rays
光线-表面相交
既然 R e c u r s i v e ( W h i t t e d − S t y l e ) R a y T r a c i n g Recursive (Whitted-Style) Ray Tracing Recursive(Whitted−Style)RayT