GAMES101 13节 光线追踪 笔记

光线追踪

渲染时间花费较多,适用于影视类的离线渲染。

光线的特点

  • 光线沿直线传播
  • 光线与光线之间不会发生碰撞
  • 光线一定是从光源出发,最后进入人的眼睛
  • 光路是可逆的

样例

(img-cDY72Ffk-1649170714359)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405203609660.png)]

前提:眼睛和光源都假设为点没有大小

eye ray: 眼睛过image plane的一个像素做射线,最终取射线与物体相交的最近的点。

(巧妙的解决了深度测试的问题,取最近的点,也就是比这个点远的点直接舍弃,也就不会有后续的shadow ray了)

shadow ray: 相交的点与光源连接的射线,如果光源到这个点的路径中有其他的点,则说明该点处于阴影中。

如果点可见则用着色模型将该点的颜色计算出来,再写入该像素点。

Whitted-Style Ray Tracing

适用于光线弹射很多次的情况

前提:反射是完美反射,有反射和折射

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DgOB1Sz2-1649170714361)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405210151522.png)]

内容:

primary ray: 同eye ray相同

secondary rays: primary ray射到最近点会发生反射和折射,并且会有能量损失,这个过程中形成的一些光线。

shadow rays: 将某一个像素的对应的最近点的反射和折射产生的最近点与点光源连接起来。

判断这些点是否可见,如果可见,则对该点进行着色计算,并且将这些得到的值,都加入到最终该像素的颜色中。

实现

光线的定义:

光线有一个起始点,有一个方向

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CjisXXyj-1649170714364)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405211507416.png)]

起始坐标为o,d是单位方向向量,因为光线是一条射线,所以t的范围是大于0的

t是时间,也就是光线r从o出发,沿着d方向,t时间内走了多远

球的定义:

球上的点p,到圆心的距离都等于半径R

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VQoX38t1-1649170714365)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405212215882.png)]

交点的计算:

光线与圆的交点的计算:

交点:一个点又在光线上又在圆上,也就是同时满足两个表达式

一个点在光线上表示为o+td,这个点又在圆上,带入圆的表达式,得到以下表达式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jerrz1SV-1649170714365)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405212927261.png)]

展开表达式,通过计算将t表示出来,得到t的表达式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0CGxwvDR-1649170714366)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405213017704.png)]

根据不同的情况,t有不同的值,t的值大于0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ism3ZnIS-1649170714367)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405213130915.png)]

  1. 如果没有交点,则根号项为负,
  2. 如果有且一个交点,则t只有一个值
  3. 如果有两个交点,则t取较小值
类推:光线与其他隐式图形的交点的计算

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mnGeMQKw-1649170714367)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405213731561.png)]

隐式图形:有等式表示的图形,判断表面上有哪些点不容易,但是判断某个点是否在表面上比较容易。

显式图形:直接给出,或者参数映射得到的图形,判断表面上有哪些点比较容易,但是判断某个点是否在表面上不容易。

将光线上的某点带入表达式中,最后计算出变量t即可

t满足的条件: 是实数,不是虚数;大于0

光线与其他显式图形的交点的计算

遍历所有三角形,让光线与三角形求交点,最终得到光线与图形的交点情况

光线与三角形面求交点
利用光线与三角形所在平面求交点来计算

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JfBAx15C-1649170714368)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405215112250.png)]

由于三角形是一个平面图形,那么三角形一定处于某个平面上,光线与三角形求交,可以转化为光线与平面求交,得到交点,再判断得到的交点是否在三角形的内部,如果在则光线与三角形有交点,否则与三角形没有交点

平面的表示

一个法线和一个平面内的点可以确定一个平面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9m6Tx4j1-1649170714368)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405215626679.png)]

如果点p在平面上,那么pp0向量与法线的点积是0,也就是90度。

最终会表示为右边的三元一次方程

交点计算

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ItX0TwDU-1649170714369)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405220109654.png)]

将光线上的点,带入平面的表示方程,最终求得t,并且判断t的范围。

Moller Trumbore Algorithm

计算光线与三角形交点的一个快速方法

交点可以表示为左边的表达式,因为三角形内的某个点可以用重心坐标表示出来,所以交点可以表示为右边的式子,两边的式子相等

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1zoCeo62-1649170714369)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405220422884.png)]

最终表达式如下,将t解出即可,t是实数非负,b1和b2也非负

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cvJJi8zM-1649170714370)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405220723593.png)]

利用包围盒来加速计算

包围盒(Bounding Volumes):一个物体可以用一个简单的形状包围起来,使得物体完全在包围盒里。

空间中的包围盒常用立方体,AABB表示包围盒的三组对立平行平面平行于xyz轴。

使用AABB是因为,如果光线和某个平面求交点的话比较麻烦,需要更多的计算,如果使用平行于xyz轴的平面,则计算时候可以使用某个分量的距离来直接计算t,例如平面垂直于x轴,则px-ox表示平面与光线起点的距离,dx表示时间dt内光线的x方向的变化量,两者相除得到时间t,相当于路程除以速度得到时间的效果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NcwAS8BL-1649170714370)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405224642765.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bW5PxTZg-1649170714371)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405222132436.png)]

光线与包围盒的交点

矩形示例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KWPfrbKl-1649170714371)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405222638497.png)]

光线与立方体的一组对立平面分别求交点,得到第一组tmin和tmax,光线与立方体的另外一组对立平面分别求交点,得到第二组tmin和tmax,最终我们可以得到光线穿过矩形的时间是较大的tmin和较小的tmax

包围盒示例:

包围盒有三组的平行对立面,

光线进入包围盒:光线进入三个平面

光线离开包围盒:光线离开一个平面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0MPEPNua-1649170714372)(C:\Users\huangxuemei\AppData\Roaming\Typora\typora-user-images\image-20220405223234201.png)]

对包围盒的三组平行对立面都分别求tmin和tmax

所以光线进入包围盒的时间应该是最大的tmin,离开的时间应该是最小的tmax,如果tin<=tout说明光线进入过包围盒,也就是光线与包围盒有交点。

在tin<=tout的情况下考虑时间的正负:

  • 如果tout小于0,说明包围盒在光线的背面,也就是光线与包围盒不可能有交点
  • 如果tout大于等于0,但是tin小于0,说明光线的起点在包围盒内,说明光线与包围盒绝对有交点

最终,如果光线与包围盒有交点,需要满足tin<=tout并且tout>=0

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值