Ray Tracing

Whitted-Style Ray Tracing

  • 问题:

Ray-Surface Intersection

Ray Intersection with Implicit Surface

数值求解

Ray Intersection with Explicit Surface

点如果在封闭形状内,向外打一条光线,得到的交点数量一定是奇数;如果在封闭形状外,则交点数一定是偶 数

那么对于显示表面求交,最简单的做法就是遍历物体的所有三角形面,求交点数量,那么问题就简化为如何判断光线 与三角形面求交(这种方法很慢,之后会提到包围盒的加速算法)

Ray Intersection with Triangle Mesh/Plane

先求光线和三角形所在平面的交点p,再判断p是否在三角形内部

Moller Trumbore Algorithm

Accelerating Ray-Surface Intersection

如果对每个三角形都算交点计算量太大。

Bounding Volumes

用包围盒把图形围起来

若碰不到包围盒,则必碰不到图形

如果t(exit)<0则表明box在光后方,没有交点

如果t(exit)>=0且t(enter)<0则表明光源在box内,必有交点

有交点情况:t(enter)<t(exit) && t(exit)>=0

Uniform Spatial Partitions (Grids)

对于格子的划分一般选取C*num_of_obj

C在3D情况下一般取27

在物体比较密集的场景效果不错,但空旷场景下不好

Spatial Partition

Oct-Tree、BSP-Tree在高维下过于复杂

每次取一个方向划分,二维平面下划分为二叉树

对光线经过的区域内的图形判断是否相交

但是盒子和三角形是否相交很难判断

Object Partitions (Bounding Volume Hierarchy - BVH)

  • 对每个区域,通常选择最长的轴划分,向正方形靠近

  • 选取中位数物体划分

1
2
3
4
5
6
7
8
9
10
11
Intersect(Ray ray,BVH node)
{
if(node is a leaf node)
{
test intersection with all objs;
return closest intersection;
}
hit1 = Intersect(ray , node.child1);
hit2 = Intersect(ray , node.child2);
return the closer of hit1,hit2;
}

Radiometry - Motivation

概述

将光精确的定义出来

物理量 符号 简单定义 单位 公式
Energy Q 电磁波形式的能量 焦耳(J)
Flux P 单位时间内的辐射量 瓦特(w) $P=dQ/dt$
Intensity I 点源向某单位立体角发射的辐射功率 $w/sr$ $I=dP/dω$
Irradiance E 受照面单位面积上的辐射功率 $w/m^2$ $E=dP/dA$
Radiance L 单位投影面积单位立体角上的辐射功率 $w/m^2*sr$ $L=d^2P/dAdωcos(θ)$

Radient Energy and Flux

  • Radient Energy 单位焦耳

    光源辐射出来的能量

  • Radient Flux (Power) 单位瓦或者lumen

    单位时间的能量

Intensity

光源在某个方向上的强度

Irradiance

单位面积的Power

Radiance

单位面积单位方向上辐射的能量

Bidirectional Reflectance Distribution Function (BRDF)

定义一个比例来描述反射后的光,比例由材质决定

The Reflection Equation

由于BRDF即材质的不同,每一个Li所生成的Lr是不同的因此需要如下操作

上述分析中,dL(ωoutput)是某单位面积在ωinput方向上吸收了dE(ωinput)后向ωoutput辐射的能量

而这仅仅是ωoutput方向上吸收得到的dL(ωoutput),我们的研究需要的是这个单位面积从各个方向上吸收了能量而在ωoutput上总共辐射的能量

因此需要对整个半球积分累加dL(ωoutput)

存在递归问题,某个点的入射是别的点的出射

The Rendering Equation

自己发的光+反射从所有入射方向来的光

Path Tracing

Monte Carlo Integration

A simple Monte Carlo Solution

从一个点往各个方向(合起来是一个半圆)采样

得出直接光照的结果

Global illumination

递归实现,但是一条光线经过一点扩散成100条光线,每条光线继续扩散,因此光线在每个着色点只追踪一条路径

即对于蒙特卡洛积分只用一个采样点,会有误差,但可以在每个像素追踪多条路径进行平均减小误差

但每条路径会无限递归,设定终止条件,每经过一个着色点有p概率不再进行追踪

在每个像素点追踪多条路径未必能准确追踪到某个光源,因此需要追踪更多的路径,效率不高

可以直接在光源处采样,如果光源和x间没有遮挡,就转换成对x采样,并对x积分