【GAMES101笔记速查——Lecture 13 Ray Tracing1】

目录

1 光线追踪

1.1 引入(为什么要有光线追踪)

1.2 基本光线追踪算法(Basic Ray-Tracing Algorithm)

1.2.1 光线的定义

1.2.2 光线投射(Ray Casting)

(1)基本步骤

(2)举例

1.2.3 递归(Whitted-Style)光线追踪(Recursive (Whitted-Style) Ray Tracing)

(1)Whitted风格光线追踪的基本步骤

(2)技术细节--如何求光线和物体表面的交点(Ray-Surface Intersection)

1:光线和球做交点(Ray Intersection With Sphere)

2:光线与隐曲面的射线相交(Ray Intersection With Implicit Surface)

3:光线与三角网格相交

问题转化:三角形在一个平面内,先考虑光线和平面,再判定点是否在三角形内。

算法优化:MT算法

速度进化:光线-表面相交的算法加速(Accelerating Ray-Surface Intersection)

包围盒/包围体积(Bounding Volumes)

如何判定光线与包围盒求交?


1 光线追踪

1.1 引入(为什么要有光线追踪)

因为:光栅化不能很好的处理 软阴影、光滑材质反射、间接光照 等问题。

下面是绝地求生大逃杀中的一个画面,它没有阴影、画面质量低,因为地图大,对质量不能有太高的要求。所以采用了光栅化,光栅化方法是一个快速的近似。

光线追踪是准确,质量非常高的方法,但它速度很慢

光线追踪大约用10K CPU核心小时来渲染一帧

所以 光栅化:实时       光线追踪:离线

1.2 基本光线追踪算法(Basic Ray-Tracing Algorithm)

1.2.1 光线的定义

关于光线的三个观点

1. 光沿直线传播                      (虽然这是错误的)

2. 光线交叉时不会相互“碰撞” (尽管这仍然是错误的)

3. 光线从光源传播到眼睛        (并且光路可逆)

“如果你凝视深渊,深渊也会凝视你。”——弗里德里希·威廉·尼采

光线传播方向倒过来,从人眼发出观测光线,也是可以理解光线可逆性的。

1.2.2 光线投射(Ray Casting)

(1)基本步骤

1. 从每个像素投射一条光线,产生某个图像的位置。

2. 从图像位置向光源发送光线,来检查这个图像是否在阴影内。

(2)举例

前提:点光源,光线打到东西之后会发生完美的反射或者折射。

step1. Eye ray投射出去,射出去之后打到物体的某个点(此时顺便解决了深度缓存的问题)

step2. 打到物体之后,连接这个点与光源,判断该点是否在阴影中。

step3. 此时可以计算出该点的着色,并且写入像素。

这时候其实还是只考虑了“一次反射”,并没有考虑更多的反射和折射的因素。

1.2.3 递归(Whitted-Style)光线追踪(Recursive (Whitted-Style) Ray Tracing)

(1)Whitted风格光线追踪的基本步骤

step1:考虑反射光、折射光。

step2:对每一条光与物体的交点,与光源连接,并将所有弹射点的计算值都求和写入像素。这个  过程肯定要考虑光的能量损失。

一些光面名词的定义如下图:

最终结果:

(2)技术细节--如何求光线和物体表面的交点(Ray-Surface Intersection)

光线在数学定义为一个射线,有起点o和方向d。

光线上的任何一个点都可以用r(t) = o + td表示。

1:光线和球做交点(Ray Intersection With Sphere)

写出光线函数、球表面隐函数。

交点又在球上、又在光线上。

将光线方程代入点p,可得关于未知量t的方程,求解其中的t值即可。

二次函数展开,用求根公式求解即可。

t必须是正的,有实际物理意义,不能是虚数,必须是实数。

2:光线与隐曲面的射线相交(Ray Intersection With Implicit Surface)

推广到隐式曲面,解决方法也是一致的。

如何解这种式子,现在数值计算的方法很方便,不用担心求解。

3:光线与三角网格相交

上面讨论了隐式曲面与光线交点的求解方法,下面讨论显式曲面。

如果我们能找到光线与三角形的交点,我们可以知道以下信息:

·三角形的可见性、阴影、光照……

·某个点是在模型内还是模型外

       奇数个交点:物体内

       偶数个交点:物体外

那么如何计算交点?

·最简单的求交方法:遍历所有三角形,连接三角形和光线

·简单,但很慢(加速方法之后说)

·只考虑交点有1和无0,图形学很少考虑边界条件。

问题转化:三角形在一个平面内,先考虑光线和平面,再判定点是否在三角形内

平面的定义:给平面上任意一个点、一条法线,就可以定义一个平面。

平面上任何一个点p满足:(p-p’)·N = 0

计算光线和平面的交点:

       把点p换成o+td代入,求t。判断t是否有物理意义。

若t有意义,则说明有交点,接下来判断交点是否在三角形内:

叉乘,之前讲过。

是否有一次计算出结果的好方法?上面这个太麻烦了。。

有的,懒惰是生产力。

下面介绍MT算法:

算法优化:MT算法

如果光线与三角形有交点,那么交点坐标可以用三角形重心坐标来表示,因此可以列出以下的式子:

其中未知量为t\b1\b2,而且里面的向量又是三维的,所以有三个式子三个变量,可以求解。

线性代数中的克莱姆法则可以求解t\b1\b2。

如果系数(1-b1-b2)、b1b2解出来都是非负的,那么这个点就在三角形内。

速度进化:光线-表面相交的算法加速(Accelerating Ray-Surface Intersection)

这里的表面多指三角形表面。

下面这些复杂场景肯定不能用最简单的那种判定方法,需要引入新的概念--包围盒。

包围盒/包围体积(Bounding Volumes)

用简单形状的盒子把物体包起来,判断包围盒与光线的相交情况。

将长方体看作是三对面形成的交集。

平常用的包围盒叫Axis-Aligned Bounding Box (AABB) (轴对⻬包围盒)。

如何判定光线与包围盒求交?

先看二维情况:

分别求出光线和x0x1、y0y1这两对面的交点(进入时间和离开时间)

然后求2个红色线段的交集。

再看三维情况:

只有当光线进入了所有的对面,光线才进入盒子

任意光线离开了任意一个对面,光线就已经出盒子了。

故:进入时间:进入时间的最大值,离开时间:离开时间的最小值。

       如果 进入时间 < 离开时间

       那么 光线与包围盒有交点。

如何考虑时间为负数的情况?

·如果 离开时间<0

        那么 光线在盒子背后,不可能相交。

·如果 离开时间>0,进入时间<0

        那么 光线起点在盒子里,必然有交点。

·光线与AABB包围盒有交点 当且仅当

为什么包围盒要与坐标轴平行??

便于计算,计算量可以减少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值