计算机图形学GAMES101(十二)光线追踪(基本原理)

我们是怎么解决阴影问题?

当对物体着色的时候,只考虑了像素点自己,没有考虑物体遮挡。所以着色不能解决阴影。那么怎么解决阴影问题呢?

阴影映射(Shadow mapping)

可以使用阴影映射来渲染阴影。阴影映射的实质还是光栅化。
阴影映射的思想:
如果一个点不在阴影里,则我们可以看到这个点,而且相对于光源来说也可以看到这个点。如果一个点在阴影里,则我们可以看到这个点,但是相对于光源来说也看不到这个点。即一个点不在阴影里面则两者都可以看到。(这种阴影叫做硬阴影)

实现阴影映射的步骤:
1、从光源看向场景记录看到的深度信息。
在这里插入图片描述
2、从摄像机看向这个场景也会得到一个深度信息,然后将两个深度学习进行比较,如果同一个点的两个深度信息是一致的则说明这个点不在阴影内。
在这里插入图片描述
如果一个点的两个深度信息不一致,说明这个点光源看不到,这点在阴影里面。
在这里插入图片描述

Shadow mapping的实际过程

从光源看过去看到的场景如下
在这里插入图片描述
记录深度信息(Shadow mapping)
在这里插入图片描述
然后从摄像机的出发的得到下面这张图
对于这张图,每一个像素对于的实际位置都投影回光源生成的Shadow mapping上,然后对比在Shadow mapping上的深度信息和实际的深度信息,如果是一样的则说明不在阴影里,不一样说明在阴影里。
在这里插入图片描述

阴影质量:通常指Shadow mapping的分辨率的高低

硬阴影:阴影的边缘非常锐利
在这里插入图片描述
软阴影:阴影的边缘呈现一种过渡状态(越靠近物体则阴影越硬,离物体越远阴影越软)
在这里插入图片描述
Umbra:本影
Penumbra:半影
软阴影就是本影和半影的结合。
对于点光源是不会有软阴影的,有软阴影则说明光源有大小。
在这里插入图片描述

为什么要用光线追踪(Ray tracing)?

光栅化不能很好的解决全局效果。
一个是对于软阴影光栅化不能很好的解决,另一个是当光线不只反射一次时也很难解决

用光栅化或者光线追踪渲染阴影的优缺点:
光栅化速度很快,但是质量较低。
光线追踪光照效果很精确,但是速度慢

关于光线的定义

1、光线是沿着直线传播的
2、光线交叉不会发送碰撞
3、光线是从光源出发到达人眼的,而且光路是可以反转的(从人眼到光源)这叫做光线的可逆性

光线追踪利用的就是光线的可逆性,从摄像机出发,对于每一个像素发射光线,然后光线会打到场景中某一个位置,然后将这个位置作为起点和光源连起来,如果连线没有被物体遮挡则说明光源也可以照到这个位置,这就找到了一条有效的光路。
在这里插入图片描述
实现光线最终的具体过程:
首先发射光线求得光线和场景最近的交汇点。


然后将这个交汇点作为起点和光源连起来,如果连线没有被物体遮挡则说明光源也可以照到这个位置。进行着色以后就只要写回到像素点即可。
在这里插入图片描述
但在这样计算出来的光线仍然只能模拟光线反射一次,没办法模拟多次弹射

Whitted-Style光线追踪

Whitted-Style光线追踪的实现步骤:
1、从摄像机出发,对每个像素发射光线
Whitted-Style光线追踪就是在任意一个点可以继续传播光线,只需要我们计算出来折射方向即可
在这里插入图片描述
2、然后对每个发射了弹射的点都和光源连一条线,计算是否可以被光源照亮。然后对这些点进行着色,并且将所有的着色结果加到该像素上面。
在这里插入图片描述
对于不同的光线的定义:
在这里插入图片描述

怎么求光线和物体的交汇点

光线在数学上的定义
光线上的任何一个点都可以用 r(t)=0+td 表示,其中的t表示光线传播的时间,td表示光线沿着这个方向传播的距离
在这里插入图片描述
接下来就要求光线和物体的交汇点了,球的方程是 p:(p-c)2-R2=0。如果两者相交,则说明p点即在光线上又在球上。所以只需要将光线的方程带入球的方程即可。即(0+td-c)2-R2=0
在这里插入图片描述
怎么求t
在这里插入图片描述
求光线和一般性的隐式表面的焦点
在这里插入图片描述

求光线和显式表面的焦点

因为模型都是由很多个三角形组成的,要求光线和一个显示表面的焦点只需要把表面上所有三角形和光线的焦点求出来即可。所以求光线和显式表面的焦点主要解决光线和三角形的焦点问题

通过光线和三角形求焦点还可以判断某一个点是在物体内还是外面。

假如有一个正方体,在正方体内部的点朝一个方向发射一条光线(射线),发现光线和正方体的焦点是奇数个。在正方体外部的点朝正方体发射一条光线,发现光线和正方体的焦点是偶数个。如下图在这里插入图片描述

怎么求光线和三角形的焦点

步骤:
1、首先求光线和三角形所在平面的焦点
2、判断这个焦点是否在三角形内
在这里插入图片描述

平面的定义

平面上的任何一个点p都可以表示为(p-p’)点乘 N= 0,因为N是平面的法向量所以平面内的任何一条线都和N垂直,p-p’就表示以p‘作为起点p为终点的一条线。该平面的一般方程为ax+by+cz+d=0
在这里插入图片描述
要求光线和平面的焦点,说明这个点即在平面上又在光线上。所以只需要将光线方程代入平面方程即可。
在这里插入图片描述
接下来只需要判断点是否在三角形内即可。判断点是否在三角形内位于 计算机图形学GAMES101(一)。

Möller Trumbore Algorithm

上述的方法,首先要求光线和平面的焦点然后还要求点和三角形的位置关系,太麻烦了。

新方法:MT方法可以直接求光线和三角形的焦点

(1-b1-b2 P ⃗ \vec P P 0+b1 P ⃗ \vec P P 1+b2 P ⃗ \vec P P 2表示在三角形内部的点, O ⃗ \vec O O +t D ⃗ \vec D D 表示光线上的点,它们的焦点肯定是同时满足这两个方程的,所以只需要将这两个方程联立起来即可。
这样就只有t、b1、b2是未知数了,求解的过程如下图。

(重心坐标相关知识位于计算机图形学GAMES101(八))
在这里插入图片描述
一个场景里面有很多物体,一个物体的又是由很多三角形组成的,光线和物体所有的三角形求焦点太慢了,需要一个方法来加速这个过程。

包围盒(Bounding Volumes)

有一个复杂的物体,我们可以用一个相对简单的形状包起来,这个形状叫做包围盒。如果一束光线跟包围盒都没有焦点,那么跟包围盒里面的物体就更不可能有焦点了。这样就减少了计算量。
在这里插入图片描述
对于三维物体一般用长方体来当作包围盒。一个长方体可以理解为是三个不同的对立面形成的交集。

为什么要这么理解?

因为平常使用的包围盒叫做轴对齐包围盒(Axis-Aligned Bounding Box)缩写:AABB。这个长方体的任意一条边都和某一条轴(x、y、z轴)是平行的。在二维平面上就是对于一个长方形,这个长方形的边都是和轴对齐的。
在这里插入图片描述

二维平面上光线和包围盒求焦点

在二维情况下,包围盒的两个对立面就变为了两条竖线。我们只需要算出光线什么时候和X0相交,什么时候和X1相交,就可以算出光线在x方向和包围盒相交的点了。在tmin时刻进入了包围盒的对立面,在tmax时刻离开包围盒的对立面。(如下面左图)

光线与y方向的判断同理(如下面中图)。

刚刚分别得到了x方向和y方向的进入、离开时刻,那么如何得到光线进入、离开整个盒子的时刻呢?

只需要求两端线段的交集(如下面右图)
在这里插入图片描述

三维平面上光线和包围盒求焦点

三维情况下一个包围盒有三个对立面。

光线进入所有对面(三个对面)的时候,才可以说明光线进入这个盒子,而当光线离开任意一个对面的时候,就可以说明光线离开了这个盒子。

对于一个三维的包围盒,有三个不同的对立面,各计算一次光线进入对立面的最小时间tmin和最大时间tmax。由于光线进入所有对面(三个对面)的时候,才可以说明光线进入这个盒子,那么计算出光线进入盒子的时间就是tmin中最大的,即为tenter,也就是光线最晚进入的那一组对面的时间。同理,由于光线离开一个对面的时候,就可以判定光线离开这个盒子,那么光线离开离开这个盒子就是tmax中最小的,也就是光线最早离开的那一组对面的时间,即为texit

这样就得到了光线什么时候进入的盒子以及什么时候离开的盒子。

如果进入的时间小于离开的时间,即tenter<texit说明这段时间光线就在盒子里,说明光线和盒子有焦点。
在这里插入图片描述

接下来考虑时间t的正负

  • 如果离开盒子的时间为负,则说明光线在盒子后面,无交点。
  • 如果离开盒子的时间为正,而进入盒子的时间为负,则说明光线的起点就在这个盒子里面。一定有交点。

总结:
当且仅当进入时间小于离开时间且离开时间非负,则证明有交点。

在这里插入图片描述

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值