图形学GAMES-101 课堂笔记(二)- Ray Tracing

Ray Tracing(part-2)

前言

GAMES101 现代计算机图形学入门

主讲老师:闫令琪,UCSB

课程主页:https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html



该笔记对应此课程Lecture13-16内容,一方面便于自己后续回忆,另一方面希望给予读者简洁的重点一览。

后面我会抽空补上前面关于光栅化等一系列成像操作pipeline的总结作为课程笔记(一)的内容。

Why Ray Tracing

       光栅化在阴影生成时一般使用shadow mapping方法通过深度测量来计算投射阴影,虽然改进后可以支持软阴影,但是计算依然比较复杂。

       此外,Glossy reflection和Indirect illumination等情况下,即光线反射多次时,体现了光栅化传统方法的局限性。

基本算法

关于光线:

  1. 直线传播
  2. 相互之间不存在碰撞
  3. 从光源通过反射,最终进入摄像机(遵从光路可逆)

Recursive Ray Tracing

       也叫做Whitted-Style ray tracing

       从eye point出发,沿着直线光路找到primay ray与物体的交点,然后计算通过反射、折射等形成的secondary rays,以此类推。再通过光源与前面得到的所有交点计算shadow rays是否可以照射到,然后沿着光路正向传播并计算衰减,最后汇总成每个点在eye point中的着色。如下图:


图1 :Whitted-Style ray tracing

表面交点

       以光线与球体交点求解为例子:


       求解t如下:


       同样,这样的计算方法也可以应用于隐式表面的表达方式。此外,通过光线上的交点奇数还是偶数个,可以判断其中一点在物体内部还是外部。

       对于一个三角面所在的平面,定义这个平面过点p’且法线为N,在结合光线的限制,我们得到了关于交点p的两个限制条件:


       从而解出光线与平面的交点,再通过叉乘判断点是否在三角内部。另一种Moller Trumbore算法可以直接计算三角和点关系,有兴趣可以自己查一下,本质和上面是相同的,这里就不贴图了。

加速

       很显然,如果直接按照以上的方法计算所有的线路和物体,那么开销实在是过于离谱。因此人们通过引入包围盒(Bounding volume)来加速交点计算————无法照射到包围盒的光线,也无法达到其内部包住的简单物体。


       大多数情况下,轴对称包围盒(Axis-Aligned Bounding Box)的使用比较广泛,也称为AABB。这种包围盒的3个轴对应xyz坐标轴,计算起来比较简单。

       这种情况下,包围盒的应用就等同于空间划分,其实中三个例子是:八叉树,KD树和BSP树。(注意BSP-Tree已经不是AABB的做法)


       KD-Tree中,仅仅在叶子节点上存储对象列表,所有的空间划分都在中间节点里存放。计算光线时,从顶点向下递归计算,每当光线通过路径上叶子节点空间时,将其中每个对象物体和它求交点,这样,对于和光线没有交点的空间中的物体就省去了多余的计算操作。

       但是,KD-Tree的缺陷在于,对于一个三角面,我们很难判定它和空间的分割面是否存在交集。所以,后来广泛采取的划分方法不再使用空间划分而采用物体划分。

       物体划分的BVH方法大致思想与空间并无不同,仅仅在划分标准上有所区别。


       BVHs的数据结构中,中间节点存放Bounding Box和孩子节点指针,叶子节点上存放Bounding Box和对象列表。

辐射度量学(Radiometry)

       
这里引入了两个度量,辐射强度(Radiant intensity)
,代表单位立体角内通过的能量。立体角是角度投影到3维空间中的概念,计算表示为面积和半径平方的比

       另外,视频中还提到了微分立体角的概念(Differential Solid Angles),对这个概念有疑惑的可以参考高等数学中的球面积分,有助于理解。


       辐照度(Irradiance)表示单位面积上的辐射通量。相比于辐射密度而言,前者对应单位面积,后者对应单位立体角。 计算对应面积内的辐照度时,如果光照不垂直于平面,则先将其投影到法线方向,再进行计算。


       辐射率(Radiance)同时考虑立体角和照射面积,做了两次微分。


       双向反射分布函数(BRDF)描述了平面上的一个部分面积在接收了一个立体角的辐射率后,计算这个部分的辐照度对于不同射出角度的比例。


       渲染方程(Rendering Equation)表述了一个点的出射光由两部分组成:自身光源和通过BRDF的反射光。作为一个完备的定义总结了所有点的光线传播情况,简单但是普适。


       对其简写为算子形式,L则会表现类似为泰勒展开的形式:


       这样的分解可以将渲染方程积分的形式表现成多次弹射的结果的集合,即全局光照。

蒙特卡罗路径追踪

蒙特卡罗积分


       关于蒙特卡洛积分,老师虽然讲的很简短,但是也大概说明白了做法。想要深入了解的话,网络上有许多相关内容的详细介绍,在这里就不在复制黏贴一遍了,简单推荐一个: 蒙特卡洛方法与定积分计算

路径追踪

       路径追踪不同于最开始提到Whitted方法,它严格遵循之前所提到的渲染方程,用蒙特卡洛方法计算该积分方程。

       对于直接光照的计算:


       更进一步,我们将间接光照和直接光照结合起来,这样就能计算全局光照的结果,得到以下递归算法:


       但是,可以很容易想到的是,在这样的递归情况下,光线数量会在几次反射之后指数爆炸。于是,我们假设,对于一个点,我们反射后只追踪一条光线,这样就能避免指数爆炸的情况,于是我们的路径追踪中默认N=1。(N!=1时,成为分布式光线追踪)

       此外,我们不人为的规定一个反射次数来限制,而是采用俄罗斯轮盘赌(Russian Roulette)的方式以一个概率P_RR进行反射。最终结果/P_RR,这样就能收敛到期望值。我们改进算法如下图:


光线采样

       考虑到对每个点盲目均匀采样过于浪费,因此我们希望直接对于光源进行采样。但是,渲染方程规定的是在一个接受点的的反射积分,又因为蒙特卡洛算要求对于积分域进行采样,因此我们无法直接使用光源的采样结果计算蒙特卡洛积分,所以我们设法将渲染方程改写成对于光源的形式。


       只需要计算da和dω的关系并进行变量替换即可:


       结合以上简化,我们将全局光照的计算再次分开,对于光源的反射,我们采取改写方法直接采样光源计算,而对于其他非光源的光线,我们依旧采取俄罗斯轮盘赌的方式进行计算。最终路径追踪算法如下:


小结

       之前的光线追踪一般指代Whitted-style方法。然而经过多年的演化,如今现代化的光追技术已经变成包含一系列光线传播相关的方法和模型的集合。比如作为例子提到的path tracing,更多的还有Photon mapping、Metropolis light transport、VCM/UPBP。

       同时,在这几节课的例子中,还有很多问题没有深入说明:重要性采样(importance sampling)、低差异度序列(low discrepancy sequences)、像素重建过滤器(pixel reconstruction filter)、伽马矫正(gamma correction)等。希望深入了解的朋友可以自己沿着这些点继续学习下去。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2023 Tritonchen
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

微信