GAMES101-现代计算机图形学入门-闫令琪——Lecture 13 Ray Tracing 1
Why Ray Tracing?
- 光栅化很难很好的解决全局的影响
(Soft) shadows
还有一些特殊情况当光反射不止一次(间接光照)
光栅化虽然很快,但是质量相对较低 - 光线追踪虽然很准确,但是很慢
光栅化:实时; 光线追踪:离线应用
一帧就需要花10K个cpu小时
Basic Ray-Tracing Algorithm
Light Rays
关于光线的三个定义:
- 光线沿直线传播
- 光线不会发生碰撞
- 光线会通过光源发射,经过不断反射,最终到达我们的眼睛(也可以用可逆性,可以从眼睛出发)
Ray Casting - Shading Pixels (Local Only)光线投射法
假设光源和眼睛都是点
- 从眼睛开始往场景中成像平面中的一个像素投射出一个光线。
- 光线会打到场景中最近的一个物体。
- 然后从这个交点往光源连接一条线,如果被遮挡就是阴影,否则会被照亮
- 利用法线和入射方向和出色方向可以计算着色,然后把结果写入像素
Recursive (Whitted-Style) Ray Tracing(Whitted风格的光线追踪)
把同一个点的不同位置算出的着色值相加填入像素中。其中也会包含能量损失
- primary ray
- secondary rays
- shadow rays
Ray-Surface Intersection (交点问题)
- 光线:有一个起点 o 和一个方向 d
光线和球的交点
- 交点又在球上又在光线上:
- t是未知:
求解:
- 可以根据解的个数来判断关系
推广:光线和隐式表面求交:
解需要是实数(有意义),还需要为正
光线和显示表面求交:(光线和三角形求交)
可以判断光线是在形状内部还是外部:随便取一个点,随便取一个方向,定义个光线,和封闭物体取交点数,如果点在内部交点一定是奇数,在外部一定是偶数
- 简单的思路:一个一个三角形判断是否和光线相交
- 简单但是慢
- 只考虑有一个交点或者没有交点
可以简化成光线和平面求交,再判断交点是不是在三角形内部。
平面的定义(Plane Equation):
- 一个点p`和一个法线N
- 求解:
有没有办法一下子解出来:
- 利用重心坐标,系数相加等于1,且三个系数非负就说明点在三角形内
提高性能
普通的方法:
引入包围核(Bounding Volumes)
Bounding Volumes(包围核)
包围核要是都碰不到,里面的东西根本不用看
我们使用的包围核通常是轴对齐包围核(AABB)用xyz轴范围就可以限定住。
Ray Intersection with Axis-Aligned Box
分别求光线你进入和离开每个对面的时间,只有当时间交集存在的时候才说明光线经过盒子
还需要考虑t的正负情况:
为什么要用横平竖直的盒子?计算会相对容易