[计算机图形学]光线追踪:加速结构(前瞻预习/复习回顾)

news2025/1/14 1:05:46

一、前言

上篇我们提到了,如果在光线追踪中,我们真的用每个像素发出的光线,以及在场景中弹射之后的光线与场景中的许多模型的上千万个三角形求交那将是一个非常慢的计算过程,所以,本篇我们将介绍一些加速结构来加速这个过程。

二、Axis-Aligned Bounding Box (AABB)—轴对齐包围盒

1.Bounding Volumes—包围盒

包围盒是一种加速结构中常用的做法,对于任意一个复杂的形状,我们都用一个简单的形状把它包围起来,如上图中的茶壶被矩形/圆形包围,而空间中的模型也是一样。这里面的思想是,如果光线连包围盒都碰不到,那就更不可能碰到包围内的物体了。

2.轴对齐包围盒(AABB)

在实际情况中我们经常用到的是轴对齐包围盒,意思就是说这个包围盒的6个面都是和三维空间的坐标轴对齐的,它们分别和XOY,YOZ,XOZ平面平行。这样做的目的是方便后面的计算。

我们先以二维情况作为例子说明,假设平面空间中有一个二维的包围盒,然后我们仍然用光线o+td先和包围盒的与y轴平行的x0和x1面求交,我们可以得到光线进入到达x0的时间tmin,从x1出去的时间tmax,同样的我们对y0,y1两个面做同样的运算也可以得到两个t值,那么光线在包围盒中的是那一段呢?显然我们对左,中两幅图求交就是最右面的图,也就是光线进入包围盒和出去包围盒的时间。为什么会这样呢?我们说,轴对齐包围盒本身就是坐标轴的面求交得到的一个空间,那么光线在这片空间中的时间自然也就是进出各个面的光线时间求交。

根据上面的结论我们推广到三维空间,无非就是多了一个面,那么什么时候光线进入了盒子呢?很简单,当光线进入了所有的面,就说明光线进入了盒子,而光线离开任意一个面,就说明光线离开了盒子。所以光线进入盒子的时间就是光线进入三个面时间中的最大值,而光线离开盒子的时间就是光线离开三个面时间中的最小值。而如果求出的进入盒子时间<离开盒子时间也就说明光线进在盒子里面待了一段时间,也就是和包围盒有交点。

那么负值如何考虑呢?首先光线不是直线,是一条射线,所以我们要考虑正负。分几种情况:

首先如果进入时间离开时间都>0,那么说明盒子是在光线起点的背后,也就一定没有交点

其次如果进入时间<0,而离开时间>0,那么说明光线的出发点o在盒子里面,也就一定有交点

那么也就说明,当且仅当进入时间<离开时间离开时间>0的时候,光线与包围盒才有交点

最后解释一下为什么轴对齐包围盒容易计算,我们前面提到过光线与平面求交的计算,而这是通常情况,平面不一定与坐标轴对齐。而如果我们使用轴对齐的特性,如上图的第二幅图中,我们可以直接用水平分量x计算光线与平面相交的时间t,这会简便很多。

三、Uniform Spatial Partitions(Grids)—均匀空间划分

紧接着我们的AABB,我们来说包围盒中和光线的具体运算过程,首先对于上面的物体,我们先找到一个包围盒,然后均匀的划分空间成很多小格子,然后找到哪些格子里面有物体,这是在做预处理。

在预处理之后,我们就可以对光线进行求交计算了,如果在一个小格子中既有物体又有光线,那么说明光线和物体可能有交点,就在这个格子里进行光线与物体表面的求交计算,否则就不会计算。那么我们怎么知道光线穿过了哪些格子呢?要一个一个进行求交计算吗?实际上是不需要的,这里其实可以用到光栅化直线的算法,如引入增量运算的Bresenham算法等,感兴趣的朋友可以自行了解。

那么格子划分的疏密怎么确定呢?划分的如果太稀疏,假如不划分,只用一个大包围盒,那相当于没有加速结构,而如果划分的太密集我们又要多次计算光线与小网格的求交。而经过不断的尝试人们发现,划分网格的数量应该等于某一个常数C乘上场景中物体的数量。

四、Spatial Partitions—空间划分

在上面提到的均匀空间划分中,我们会碰到很多问题,假如在一个很空旷的操场中放置了一个茶壶,那么我们需要先用一个很大很大的包围盒把操场包起来,然后在里面划分好多好多格子,然后光线与许多格子求交最后才能找到这个茶壶。也就是说在物体没那么多的地方,我们不需要划分很多格子,直接用一个大格子就可以了,而物体密集的地方格子划分的密集一些就好了。而改进后的方法就是Spatial Partitions—空间划分。而划分结构也分很多种,包括Oct-Tree(八叉树)KD-Tree(KD树)BSP-Tree(二叉空间划分树)。在这里我们主要介绍KD-Tree,原因是KD-Tree在高维仍然很好用,而像八叉树在二维空间中是四叉树,三维空间是八叉树,更高维的空间就变成了2的n次方叉树。而BSP树,在二维空间我们是用线划分,三维空间用平面划分,而高维空间我们则需要用超平面划分,也很麻烦。而KD树的做法是各个维度按顺序依次划分,先对着x划分,然后y,然后z,然后再xyz,如果更高维度就变成xyzw循环,每次对空间划分只划分两个区域。

而正是因为我们每次都只把空间划成两块区域,我们自然可以用二叉树来存储这一加速结构。同样的,KD树也是在我们做光线追踪前对包围盒的预处理。与此同时,中间节点A,B,C,D并不存储任何对象,而对象物体都存储在叶子节点中。

和之前的均匀网格一样,我们对KD树划分的区域也同样需要进行求交。在预处理完包围盒之后,我们就可以对划分的区域进行求交了,步骤如上图所示,先对A求交,发现与A有交点,那么就要对A的子节点也进行求交,因为1没有继续划分,所以对1内的物体进行求交,再对B节点求交,然后沿着子节点依次这么做,最后对C节点的子节点3内的物体求交时成功找到了光线与物体的交点。

当然KD-Tree也有它的问题,例如,我们怎么判断一个立方体格子和一个三角形求交。其次一个物体可能会被存储在很多不同的格子里,这显然加大了复杂程度。

五、Object Partitions & Bounding Volume Hierarchy(BVH)—对象分区&边界体积层次

针对上面KD-Tree存在的问题,人们又发明了一种划分方法,只不过这次划分的并不是空间,而是划分物体。如果我们有一堆三角形如上图,我们把这堆三角形分为两部分,然后分别求它们的包围盒,这两部分作为最初节点的两个子节点,然后再对下面的子节点用同样的方法划分它们,也是重新求出它们的包围盒,递归下去,直到叶子节点中的三角形足够少的时候停下来。同样中间节点只存包围盒与子节点的指针,只有叶子节点存储物体。用这种方法我们同样可以建立起一个树结构,而且有效避免了KD-Tree中一个三角形出现在多个节点中的问题。

当然BVH也有它的问题,如这些重新划分的包围盒之间会有重合,当然重合的影响并不是致命的,只要划分的重合度导致的误差过大以至于发生错误。所以怎么划分也是一个很难研究的问题。

为了均匀划分,我们通常每次都沿着最长的轴划分,从而保证包围盒不过于“细长”或者“矮扁”。

如何把物体分成两半呢?人们通常取处在中间位置的物体来划分,这样可以保证两部分的物体数量差不多,也就可以使得构建的树结构的最大深度最小,也就是树两个叉的深度平衡。而这本质是一个取中位数的问题,在n个数中快速取得第i大的数实际上是一个快速选择算法,时间复杂度是O(n),感兴趣的朋友可以自行了解。

 光线与BVH求交的伪码

光线和BVH的求交并没有本质区别,也就是包围盒加速结构的应用本质上都是类似的,同样的我们做光线与包围盒的求交,如果与父节点有交点,则计算与其它两个子节点的求交,如果子节点是叶子节点则计算光线与叶子节点内物体的求交,否则继续计算子节点的子节点,如此递归的算法。

最后做一下比较,对于KD-Tree,它是对空间划分,并且一个物体可能被存储在不同的区域。而对于BVH,则是对对象进行划分,并且它们重新划分的区域可能会重叠。

六、总结

到这里整个Whitted-Style光线追踪以及包围盒的加速结构和求交算法就都介绍完了,下节课我们进入辐射度量学,是一种更现代,效果也更好的方法。

参考:

Lecture 13 Ray Tracing 1_哔哩哔哩_bilibili

Lecture 14 Ray Tracing 2_哔哩哔哩_bilibili

GAMES101_Lecture_13 (ucsb.edu)

GAMES101_Lecture_14 (ucsb.edu)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【FTP服务】

目录 一、FTP服务二、FTP服务器安装配置FTP服务的安装匿名访问开启防火墙设置本地用户修改配置文件 以图形化的格式来写入文件 三、设置白名单&#xff0c;黑名单用户 一、FTP服务 作用: 是用来传输文件的协议 端口: FTP服务器默认使用TCP协议的20、21端口与客户端进行通信 2…

OpenHarmony生态贡献获肯定,华秋践行加速硬件创业初心

4月19日,以“开源正当时,共赢新未来”为主题的开放原子开源基金会OpenHarmony开发者大会2023(以下简称“大会”)成功举办。大会现场,来自开放原子开源基金会和OpenHarmony项目的领导与专家、以及共建单位、行业伙伴和社区开发者们共聚一堂。值得信赖的电子产业一站式服务平台华…

【软件测试】四面成功上岸美团

最后&#xff0c;总结一下个人认为比较重要的知识点&#xff1a;接口自动化测试 &#xff1a;测试框架&#xff0c;多个有关联的接口的用例编写&#xff0c;用例的组织及存储&#xff0c;接口测试的覆盖率&#xff0c;RESTAssured 的封装等。UI 自动化测试 &#xff1a;iOS 和 …

二维码+互联网云技术在中建二局施工项目管理中的应用实践

中建二局&#xff08;全称&#xff1a;中国建筑第二工程局有限公司&#xff09;是世界500强企业—中国建筑股份有限公司的全资子公司&#xff0c;是集房建、基建、核电、火电、风电等多种建设和投资相融合的、国内最具综合实力的大型国有企业集团公司。中建二局具有土木建筑、设…

Jetson Orin Nano下部署 Yolo v5

在网上找了好多关于Jetson Nano部署Yolo v5的帖子&#xff0c;由于每个人的环境和版本都不同&#xff0c;过程也都有所不同&#xff0c;因此在Jetson Orin Nano CLB上安装Yolo v5也有必要记录一下过程&#xff0c;以便后续无脑重装&#xff0c;让我们开始。 由于我这个Jetson …

【IT成神路之我在起点学网络~】

什么是网络&#xff0c;一开始我以为是能刷刷剧&#xff0c;让我看到心仪idol&#xff0c;坐在家中看祖国大好河山就是网络。 长时间浸泡在网络上&#xff0c;不得不让我思索我为什么能看到高清不卡顿的精彩视频。 于是乎……我开始大肆搜索网络的资料内容。 IT嘛&#xff0…

OCR技术大揭秘:纸质文档数字化的新选择

引言 OCR&#xff08;Optical Character Recognition&#xff09;即光学字符识别技术&#xff0c;是一种将纸质或电子文档中的印刷文字转化为可编辑和可搜索的数字文本的技术。随着数字化和信息化的快速发展&#xff0c;OCR 技术逐渐成为处理大量纸质或电子文档的主要手段之一…

【Zblog建站】搭建属于自己的博客网站,并内网穿透实现公网访问

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

基于Java+Springboot+vue网上商品订单转手系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

机器学习(一)K近邻算法(KNN)原理剖析及python源码

本篇介绍第一个机器学习算法&#xff1a;k-近邻算法&#xff0c;它非常有效而且易于掌握。首先&#xff0c;我们将探讨k-近邻算法&#xff08;KNN&#xff09;的基本理论&#xff0c;以及如何使用距离测量的方法分类物品&#xff1b;其次我们将使用Python从文本文件中导入并解析…

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

如何设计一个高并发系统

目录 如何理解高并发系统 1. 分而治之&#xff0c;横向扩展 2. 微服务拆分&#xff08;系统拆分&#xff09; 3. 分库分表 4. 池化技术 5. 主从分离 6. 使用缓存 7. CDN——加速静态资源访问 8. 消息队列——削锋 9. ElasticSearch 10. 降级熔断 11. 限流 12. 异步…

算法刷题总结 (八) 前缀和

算法总结8 前缀和 一、前缀和的概念1.1、什么是前缀和&#xff1f;1.2、常见类型1.2.1、求数组前i个数之和1.2.2、求数组的区间和 二、经典例题2.1、求数组前i个数之和560. 和为 K 的子数组 - 前缀和哈希表525. 连续数组 2.2、求数组的区间和303. 区域和检索 - 数组不可变643. …

学系统集成项目管理工程师(中项)系列06b_信息系统安全管理(下)

1. 物理安全管理 1.1. 计算机机房与设施安全 1.1.1. 计算机机房 1.1.1.1. 机房场地选择 1.1.1.2. 机房空调、降温 1.1.1.2.1. 基本温度要求 1.1.1.2.1.1. 应有必要的空调设备&#xff0c;使机房温度达到所需的温度要求 1.1.1.2.2. 较完备空调系统 1.1.1.2.2.1. 应有较完…

C语言——隐式转换

目录 前言 隐式转换 1.整型提升 2.算数转换 前言 这里小编给大家简单的补充一下&#xff0c;一些有关C语言的知识点 隐式转换 由于转换形式的不同类型转换这里一共分为整型提升和运算转换两种形式 1.整型提升 在了解整型提升之前&#xff0c;这里我们需要先了解一下截断…

自媒体助手软件开发需具备哪些功能?

自媒体助手软件开发需具备哪些功能&#xff1f; 1、多平台多账号管理。 用户可以在单独的平台上管理其他平台的账号&#xff0c;不需要登录多个平台&#xff0c;为用户减少了大量的时间&#xff0c;与此同时可以记忆账号和密码&#xff0c;提供分组管理&#xff…

【C进阶】详解预处理指令

文章目录 预定义符号#define#define定义标识符#define定义宏#define替换规则#和##带副作用的宏参数宏和函数对比#undef命令行定义 条件编译文件包含头文件被包含的方式嵌套文件包含 其他预处理指令总结 预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DA…

解码星地一体农机导航:无网作业,极致

星地一体系列农机导航最强大之处是在全国任何地方都拥有信号&#xff0c;即使是在偏远的戈壁滩也能作业&#xff0c;因为星地一体系列导航采用星地融合技术&#xff0c;彻底解决信号问题&#xff0c;通过卫星播发差分信号的服务&#xff0c;在中国&#xff0c;只要可见卫星&…

Windows下如何查看某个端口被谁占用被杀死占用进程

开发时经常遇到端口被占用的情况&#xff0c;这个时候我们就需要找出被占用端口的程序&#xff0c;然后结束它&#xff0c;本文为大家介绍如何查找被占用的端口。 1、打开命令窗口(以管理员身份运行) 开始—->运行—->cmd&#xff0c;或者是 windowR 组合键&#xff0c;…

Win10桌面我的电脑怎么调出来?最简单方法教学

Win10桌面我的电脑怎么调出来&#xff1f;有用户发现自己的电脑桌面没有我的电脑这个程序图标&#xff0c;每次要访问磁盘的时候&#xff0c;开启都非常的麻烦。那么怎么将这个图标设置到桌面显示呢&#xff1f;接下来我们一起来看看以下的解决方法吧。 方法一&#xff1a; 在开…