Ray Tracing

Why Ray Tracing?

  • rasterization : real-time,ray tracing: offline
  • ray tracing is accurate,but is very slow

Whitted-Style Ray Tracing

渲染3d物体时计算机图形的工作之一。

同一场景的物体渲染需要考虑每个物体贡献的像素。

有两种常规的方法来考虑

  • object-order rendering ,通过找物体来计算对应像素
  • image-order rendering,通过找像素来判断物体,然后计算像素

差别可以这么来看

前者双重循环外循环是物体,后者则是像素

宽泛来说,image-order rendering 是更加简单和灵活的,一般来说也会有更长的执行事件来制造同样的图片。

Ray Tracing 就是image-order algorithm因为这样不需要像前者一样用数学器械就能实现光线追踪器。

The Basic Ray-Tracing Algorithm

基本的光线追踪器有三个部分

某种意义上,在引擎中,可以认为“眼睛发光”

  1. ray generation. 计算每个像素的view射线的来源和方向

  2. ray intersection. 计算与view射线相交的最近物体

  3. shading. 在原有的射线相交的基础上进行着色

Perspective

标准的方法来为计算机图形,艺术和照片制作图片,是使用linear perspective(线性透视)

parallel projection(平行投影)是最简单的投影方式,平移。一般用于机械和建筑

如果image plane和视线方向垂直,成为orthograph(正交投影) orthonormal(正交的)

Compute View Ray

phase 1

为了生成ray,我们首先需要一个数学表达

p(t) = e + t(s- e)

e is eye, s is image plane point

在代码中

详情见P84

Orthographic Views

对于正交投影view ray,

ray generation 使用相机的框架,

  1. 正交投影从image plane的一个像素的位置开始,并且全部共享相同的方向—-view direction.

  2. 而透视投影则是选择一个view point 开始,方向则是view point 到image plane的点的位置。

要将nx ny 的像素投射到(r - l) x (t - b)的矩形上

其中l,r分别是片元,pixel的左右边界坐标,b和t则是下、上边界坐标

详情见P86

Perspective Views

Ray-Object Intersection

phase 2

Ray-Sphere Intersection

使用implicit surface

隐式表达式f(p(t)) = 0或者f(e + td) = 0

对于一个球来说,设中心点为c

(p - c)(p - c) - R^2 = 0

注意,当满足上式,说明p对应的点已经在球上,也即intersection

(e + t d - c)(e + td - c) - R^2 = 0

只有t未知

展开得到quadratic 二次方程,判别式b^2 - 4ac

Shading

Here we will discuss how a ray tracer computes the inputs to shading

1.从点光源和直线光计算着色需要具体的几何信息。当viewing ray 确定与表面相交,我们需要决定以下4个向量。

  • 着色点x可以通过估算viewing ray 以t的值相交
  • 表面的法线向量n
  • 光源方向l
  • 视觉射线viewing direction 是viewing ray的反方向(v = -d/|d|)

2.coding

3.一旦你已经在光线追踪器上有基本的着色后,光线和点阴影添加会很容易

使用directional light 的阴影与点光源类似,但是t=无穷,也即距离无穷,环境光不进行阴影测试(shadow test)

4.Mirror Reflection(镜面反射)

为光线追踪程序添加镜面发射(or specular reflection) 很直接。

由视线计算反射光向量,易得

r = d - 2(d*n)*n

其中r是反射向量,d是view(视线)入射的向量

在现实世界中,当光线从表面反射出去,一定会有能量损失

由于光线颜色不同,损失也会不一样,这里使用递归算法(recursive)

调用shader-ray函数。

color c = c + k * shader-ray(Ray(p,r),t,infinity)

k是specular rgb color, 并且t = infinity,和shadow一样。因为并不想让光线反射到光源上

Frequently Asked

  • 为什么ray tracing 中没有透视矩阵

  • 可以实现交互式光线追踪吗

    对于充分小的模型和图片,任何现代pc都足以支持可交互式光线追踪。现实中,对于全屏的实现,多cpu共享帧缓存区是需要的。

    计算机算力进步比屏幕分辨率更快,让传统pc在屏幕分辨率下实现复杂场景光线追踪只不过是时间问题。

  • ray tracing在硬件图形程序中有用吗

    光线追踪经常用于采集,当用户点击鼠标3d图形程序的像素,程序需要决定哪个物体的显示。