为什么要光线追踪
光栅化存在什么问题
-
无法实现软阴影(光源不是严格点光源时)
-
无法解决光线反射超过一次的情况
-
相对来说光照效果的质量低
光线追踪的特点
- 准确
- 慢(相对光栅化)
什么是光线追踪
光线的基本假设
- 光线沿直线传播(x)
- 光线在传播的过程中相互不干扰(x)
- 光线从光源传播到眼睛,其物理特性在路径反转的情况下相同
光线追踪的基本原理
- 从相机沿着每个像素,向真实世界看去,找到其相交的物体
- 计算该物体的实际着色
最最基础的光线追踪(Whitted-Style Ray Tracing)
从上图可以看见,只考虑光线的一次反射,就是Blinn Phong模型,下面我们要介绍一个基础的光追模型Whitted-Style Ray Tracing。
Whitted-Style Ray Tracing 做了啥?
-
考虑了Reflected Ray
-
考虑了Refracted Rays
-
递归计算
伪代码
for pixel in image
for triangle in object
ray -> direct light
ray -> reflected ray
for triangle in object
ray -> refracted rays
for triangle in object
so!! 如何判断一个光线与三角网的相交情况??
我们怎么肝
光线-物体(Triangle Mesh)相交
- 先对光线和三角形所在的平面求交
- 判断交点是在三角形内还是外
存在的问题
- 慢
(判断次数:像素数 x 三角形数 x 碰撞数)
(判断难度:每一次均须进行光线与三角形的相交判断)
如何变得更快 - Bounding Volumes
什么是 Bounding Volumes
一个包围住物体的盒子
使用方式 & 优点
- 使用:先进行包围盒的相交判定,如果相交再和其内的三角网进行判定
- 优点:如果和物体的包围盒不相交,避免了大量的无效计算
如何划分 Bounding Volumes
Uniform grids
How To Use
- Build Acceleration Grid
- Ray-Scene Intersection
Problems
-
格子太大:相当于没有加速效果
-
格子太小:不必要的网格遍历变相导致效率下降
-
object分布不均匀导致格子难以划分
Spatial partitions(KD-Tree)
- Oct-Tree
- KD-Tree
- BSP-Tree
问题
- 一个三角形可能会属于多个叶子节点
- 进行空间划分的过程中需要对每个包围盒和三角形的相交判定(难)
Object partitions & Bounding Volume Hierarchy(BVH)
优点
- 每个三角形只会属于一个包围盒
- 根据范围内的三角形,可以直接算出包围盒的大小,避免了相交判断
参考资料
- Games 101