网站建设核电/淘宝运营培训班学费大概多少
1.前言
前文说了Whitted-style光线追踪技术的原理以及光线与平面的交点计算方式,对于现在应用最广的Polygon Mesh显式曲面来说,一个复杂场景中的多边形面总数可能达到千万甚至亿万以上,如果每个像素发射光线都和场景中每个平面进行求交点计算,那么会进行像素数量 x 光线弹射次数 x 多边形平面数量次光线与平面交点计算,计算会非常庞大,非常慢。
例如下图中的经典场景San Miguel,面数达到10.7M,渲染一张1080P图片,光线平均3次弹射,共需要进行66万亿次交点计算。
这样庞大的计算量是完全不能接受的,而一条光线在场景中弹射时和绝大多数平面是不会相交的,因此需要通过一些算法进行优化,这个算法就是包围盒技术(Bounding Box)。
2.轴对齐包围盒(Axis-Aligned Bounding Box)
用简单的方盒子称为包围盒(Bounding Box)将物体完全包裹,如果光线与包围盒没有交点,那显然不会与物体中任何三角面有交点,那也就没必要去遍历物体的三角面了。
在几种包围盒方式中,AABB即轴对齐包围盒因为包围盒三组对面分别与三个空间坐标轴平行,便于计算而使用最为广泛(下图中间)。
那么AABB包围盒就可以理解为三个不同的对面形成的交集,这样可以方便进行光线与包围盒的求交运算。如下图所示。
那么到底如何求光线与包围盒的交点呢?先将问题简化成直线与、
两对平面的交点,将三维转化成二维。
如上图最左边所示,求光线与一对 x 平面(左右无限远)的交点,将先进入的交点(距离光线起点 o 最近的那个)记为 tmin,后出去的交点记为 tmax。紧接着如中间图所示计算出光线与 y 平面(上下无限远)的两个交点同样记为另外一组 tmin, tmax。注意:如果任意的 t < 0,那么这代表的是光线反向传播与对应平面的交点。
那么如何知道光线在什么时候进入盒子,又在什么时候出去了盒子呢?
对于二维来说,如上图最右边所示,在 tmin 时间进入了盒子,在 tmax 时间出去了盒子。这实际就是求两组交点构成的线段的交集。那么这个结论是怎么得出的呢?
回想三维的情况,三维的盒子就是三个对面,最重要的核心思想:
1.只有当光线进入了所有的平面才算是真正进入了盒子中。
2.只要当光线离开了任意平面就算是真正离开了盒子。
那么,就可以得到一种算法,在三维中三组不同的对面各计算一次进入对面的最小时间 tmin 和离开对面最大时间 tmax ,时间不管是正还是负。最后算出三对进入和离开对面的时间交集,就得出了进入盒子时间 和离开盒子时间
。如下图所示。
但光线不一定会与包围盒有交点,那么什么条件下才会有交点呢?
如果 <
的时候,说明光线所在直线一定在盒子中待过一段时间,也必然存在交点。但光线并不是直线,而是射线,除了保证
<
(光线在盒子待过一段时间),还要考虑时间 t 是否为负,保证物理正确性。具体如下:
1.如果 < 0,说明包围盒在光线背后,就不会有交点。
2.如果 >= 0 并且
< 0,说明光线是从包围盒内发射出来的,就有一个交点。
3.如果 >= 0 并且
>= 0,说明包围盒在光线前面,有两个交点。
因此,只要满足 <
并且
>= 0 ,光线就一定和包围盒有交点。
根据前文中光线与平面的交点算法,光线和包围盒的求交也很容易写出,如下图下半部分所示。
以一对 x 轴的平面为例,两个平面肯定垂直于 x 轴,因此可以直接求光线在 x 轴方向的分量,代入公式从而直接得到 t 值,计算过程比光线与任意平面交点的算法要快速得多,这也是AABB包围盒得到广泛使用的原因。
3.使用AABB加速光线追踪
3.1 AABB划分方法
虽然对场景中的每个物体使用AABB包围盒技术已经可以大幅加快光线追踪效率,但实际使用中难免遇到以下两种极端情况:
- 整个场景主要只有一个极其复杂的单一模型,那么只对这一个物体做包围盒的话,相当于对效率没有提升。
- 整个场景充斥着大量的细小模型,如植物、建筑之类的,每个模型可能只有很少的面,如果此时对每个物体求包围盒,得到的包围盒数量会非常多,效率提升有限。
基于以上两点考虑,AABB不应只局限于以物体模型为单位,可以更加精细的划分成以一定数量的三角面为单位,并且对于场景的许许多多包围盒来说应该要有一种数据结构将其统一起来。
因此为了更好地划分场景形成不同的AABB,使得划分之后的AABB能够更好的加速光线追踪,在AABB的基础上出现了多种划分方法。
3.2 均匀网格划分(Uniform Grids Partitions)
3.2.1 步骤和定义
先从最简单的均匀网格划分开始。步骤如下。
1.创建一个包裹整个场景的大包围盒。如下图所示。
2.在大包围盒中创建均匀分布的网格。如下图所示。
3.将每个物体对象存储在重叠的单元格中。判定哪些小方格有物体信息,也就是与物体表面相交的小方格。注意:下图中右上角没涂对。
以上就是在光线追踪之前进行了预处理,然后就可以进行光线追踪了。在光线追踪计算时,根据光线的方向找到所有相交的小方格,倘若小方格中存储有物体,再进一步与方格中的物体模型或是三角形面求交(假设光线与小方格求交是很快的,与物体求交比较慢)。如下图所示。
均匀网格划分将空间划分为多个均匀的小的AABB,再根据光线方向找出相交的小方格(这一步并不需要判断所有方格,可以用类似brenham的方法来做),再判断小包围盒中是否存储了模型信息,若有则进一步求交。
3.2.2 网格分辨率影响
这种划分方法假设了找出相交方格要比直接判断与物体求交相对容易,因此划分方格数的数量也是影响性能的关键,方格太少就没有加速效果,方格太多则判断与方格的求交可能会拖累效率。如下图所示,左侧是方格只有一个,没有加速效果,而右侧是方格太过密集,反而增加了判断影响效率。
所以网格的数量(分辨率)应该有一个平衡,不能太稀疏也不能太密集。
所以这种方法最适合的场景就是大型对象集合,并且大小在空间中均匀分布。如下图这种场景。
如果场景较为空旷,物体较小且相互距离较远,那么均匀分割的效果就会很差了,因为会有很多无效的方格与光线的求交过程。
3.3 空间划分(Spatial Partitions)
3.3.1 定义
均匀网格划分适合场景中密集且均匀分布,那么当场景中存在大量空白区域就不适合了。所以就需要使用空间划分,密集的区域用小方格,空白区域用大方格。
3.3.2 分类
空间划分主要有Oct-Tree、KD-Tree以及BSP-Tree等划分方法。如下图所示。注意:这些划分在2D和3D中都可以使用,以下以2D为例。
1.Oct-Tree也就是八叉树,每次将空间分为8个相等的部分(三维空间横竖平各切一刀,因为图中是二维显示,所以看起来只划分了4部分),再递归的对子空间进行划分。当划分的子空间足够小或是空间中三角形面的数量很少的时候会停止划分。这种方法的显著缺点是,随着维度的上升划分的空间数量会呈指数级增长。
2.KD-Tree其每次将空间划分为两部分,且划分依次沿着 x 轴,y 轴,z 轴,即如图中所示。第一次横着将二维空间分为上下,第二次再竖着将上下两个子空间分别划分为左右部分,依次交替划分,划分时不是按空间大小而是按模型数量或者三角形数量进行均匀划分,终止条件与八叉树类似。
3.BSP-Tree其与KD-Tree类似,唯一不同的是划分不再沿着固定一轴,可以任意方向划分。缺点自然是划分的空间没有规则性,求交比较困难。
同样,空间划分也是在光线追踪之前进行预计算。
接下来从一个例子具体介绍KD-Tree。
3.3.3 详解KD-Tree
3.3.3.1 划分过程
1.空间分为左右两部分。如下图所示。
2.对左右两个子空间换个方向再分为两部分(这里为方便展示,只画出了右半部分,其实左边也是一样)。如下图所示。
3.如此递归的划分下去,如下图所示。
3.3.3.2 KD-Tree的数据结构
通过上述划分之后中遵循这样几点。
1 依次沿着x轴,y轴,z轴划分,使得空间被划分的更加平衡。
2 划分的位置由空间中三角面的分布决定,具体细节不展开。
3 叶子节点存储对应空间的所有物体或三角面信息,中间节点仅存储指针指向两个子空间。
4 当划分空间太小或是子空间内只有少量三角形则停止划分。
当KD-Tree建立完成之后,如何进行光线与物体求交判断呢?
3.3.3.3 求光线与物体交点
如下图所示,假设有一条光线进入场景,里面的圆圈代表物体。那么如何去计算光线与物体的交点呢?
1.判断光线是否与最外层的包围盒(A)相交。如下图所示。
2.如果相交,则进一步判断是否与对应的两个子包围盒相交。
上图是为了显示方便,所以左侧没有进行进一步的显示划分情况,实际会继续划分下去的,所以左半部分对应的 1号空间是叶子节点,如果光线与之相交,进一步判断与存储与叶子节点的所有物体求交。左半边判断完之后,接着判断右半部分,显然光线与左右两侧包围盒都相交。
对于左右两侧的所有子包围盒,递归的执行这个步骤即可。
更加详细的过程就不再赘述。
3.3.3.4 优缺点
优点:
利用KD-Tree的结构来构建AABB的好处是倘若光线与哪一部分空间不相交,那么则可以省略该部分空间所有子空间的判断过程,在原始的纯粹的AABB之上更进一步提升了加速效率。
缺点:
1.判断包围盒与三角面的是否相交较难,因此划分的过程不是那么想象的简单。
2.其次同一个三角面可能被不同的包围盒同时占有,这两个不同包围盒内的叶节点会同时存储这一个三角形面。
基于KD-Tree的以上两个缺点,这种方法渐渐地不再被广泛使用。
3.4 对象划分(Object Partitions)
3.4.1 BVH对象划分
对象划分与前几种方法最显著的区别就是,不再以空间作为划分依据,而是从对象的角度考虑,即三角形面。而这种划分形成的加速结构就称为BVH对象划分(Bounding Volume Hierarchy Object Partitions)。
BVH对象划分得到非常广泛的应用。在现代图形学里无论是实时的光线追踪,还是离线的光线追踪,几乎都使用了这种方法,因为它解决了KD-Tree的两个缺点。
具体划分步骤如下。
1.找出场景的整体包围盒作为根节点。
2.找到合适的划分点,将最大包围盒内的三角形面分为两部分,再分别重新计算新的包围盒。
注意:包围盒会重叠,但一个三角形面只会被存储在唯一的包围盒内,而这也就解决了KD-Tree的缺点。
3.接下来与KD-Tree的建立类似,递归的对所有子空间重复该步骤。
最终可以建立出如上图的所示的树形结构,同样为了画图方便,只进行了左半部分的划分,右半部分其实同理。
划分细节:每次划分一般选择最长的那一轴划分,假设是x轴,那么划分点选择所有三角面的重心坐标在x坐标上的中位数进行划分(快速选择算法找中位数),如此便能保证划分的三角形左右两边三角形数量尽可能差不多。当然也就使得树形结构建立的更加平衡,深度更小,平均搜索次数更少,提高效率。
而与KD-Tree一样,中间节点不存储物体三角面信息,只在叶节点中存储,划分终止条件为当前包围盒内三角形数量足够少(例如5个)。
光线与物体求交点与KD-Tree求交点是一样的,如下图伪代码所示。
3.5 空间划分与对象划分的区别
空间划分(如kd -tree)
1.将空间划分为不重叠的区域。
2.一个对象可以包含在多个区域。
对象划分(如BVH)
1.将对象的集合划分为不相交的子集。
2.每个集合的边界框在空间上可能重叠。
相关文章:

计算机图形学入门20:加速光线追踪
1.前言 前文说了Whitted-style光线追踪技术的原理以及光线与平面的交点计算方式,对于现在应用最广的Polygon Mesh显式曲面来说,一个复杂场景中的多边形面总数可能达到千万甚至亿万以上,如果每个像素发射光线都和场景中每个平面进行求交点计算…...

sys.stdin对象——实现标准输入
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 sys.stdin是一个标准化输入对象,可以连续输入或读入文件所有内容,不结束,不能直接使用。输入完成后&am…...

嵌入式项目分享| 终极智能手表,全过程+全开源分享
这是一个非常完整的智能手表开源项目,功能齐全,且资料开源,如果你是:自己平时喜欢diy的工程师,想要提升开发技能的学生,马上要做毕设的大四学生,这个手表很值得一做,别错过了~~ 所有开源的资料以及原文链接见文末。 先来看下这个手表的功能: 首先,是一个可以佩戴的手…...

【Linux详解】进程的状态 | 运行 阻塞 挂起 | 僵尸和孤儿状态
目录 操作系统中 运行状态 阻塞状态 进程状态转换 Linux系统中 查看进程状态 深度睡眠状态 T 暂停状态 Z 僵尸状态 孤儿状态 文章手稿 xmind: 引言 介绍系统中的进程状态及其管理方式。将通过结合操作系统原理和实际代码示例,详细说明进程的各种状态、转换…...

MySQL添加外键约束经典案例
1DDL建表语句 需要一个emp员工表和一个dept部门表 CREATE TABLE emp (id int NOT NULL AUTO_INCREMENT,name varchar(50) COLLATE utf8mb4_0900_as_ci NOT NULL COMMENT 姓名,age int DEFAULT NULL COMMENT 年龄,job varchar(20) COLLATE utf8mb4_0900_as_ci DEFAULT NULL CO…...

vue3监听器watch以及watchEffect的使用
一,watch()简介: 侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数 watch()默认是懒侦听的,即仅在侦听源发生变化时才执行回调函数。 watch()一共有三个参数 第一个参数:侦听器的源,可以为以…...

modelsim做后仿真的一点思路
这是以TD_5.6.3_Release_88061生成的网表文件(其他工具生成的网表文件类似),与modelsim联合进行门级仿真的样例,时序仿真与门级仿真的方法类似,只是增加了标准延时文件。 1、建立门级仿真工程 将门级网表和testbench添…...

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区
如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区 1. 问题背景 有时我们需要获取特定 HIVE 库下所有分区表,或者所有分区表的所有分区,以便执行进一步的操作,比如通过 使用 HIVE 命令 MSCK REPAIR TABLE table_name sync partiti…...

如何在 qmake(QtCreator)中指定 Mac 平台
在 Qt 项目文件(.pro 文件)中设置针对 Mac OS 的配置项。通常情况下,我们可以使用如下方式为 Windows 和 Unix 系统分别添加源文件: win32 {SOURCES += hellowin.cpp } unix {SOURCES += hellounix.cpp }虽然 Mac OS 是类 Unix 系统,但有时我们仍然需要区分它和 Linux 系…...

day39动态规划part02| 62.不同路径 63. 不同路径 II 343. 整数拆分 (可跳过)96..不同的二叉搜索树 (可跳过)
**62.不同路径 ** 本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。 题目讲解 | 视频讲解 class Solution { public:int uniquePaths(int m, int n) {// 确定数组及其下标的含义int dp[101][101] {0}; //到达i,j的点有多少条路径// 确定递推…...

声场合成新方法:基于声波传播的框架
声场合成是指在房间内的麦克风阵列上,根据来自房间内其他位置的声源信号,合成每个麦克风的音频信号。它是评估语音/音频通信设备性能指标的关键任务,因为它是一种成本效益高的方法,用于数据生成以替代真实的数据收集,后…...

鸿蒙文件操作事前准备
13900001,沙箱13900002 首选授权 module授权配置 "requestPermissions": [{ "name": "ohos.permission.CAMERA",}, { "name": "ohos.permission.READ_MEDIA",}, { "name": "ohos.permission.WR…...

AI智能时代:ChatGPT如何在金融市场发挥策略分析与预测能力?
文章目录 一、ChatGPT在金融策略制定中的深度应用客户需求分析与定制化策略市场动态跟踪与策略调整策略分析与优化 二、ChatGPT在算法交易中的深度应用自动交易策略制定交易执行与监控风险管理 三、未来展望《智能量化:ChatGPT在金融策略与算法交易中的实践》亮点内…...

C#面:C#属性能在接口中声明吗?
在C#中,接口是一种定义了一组方法、属性和事件的类型。在接口中,只能声明方法、属性和事件的签名,而不能包含字段、构造函数或实现代码。因此,C#属性不能直接在接口中声明。 然而,你可以在接口中定义属性的签名&#…...

区块链的历史和发展:从比特币到以太坊
想象一下,你住在一个小镇上,每个人都有一个大账本,记录着所有的交易。这个账本很神奇,每当有人买卖东西,大家都会在自己的账本上记一笔,确保每个人的账本都是一致的。这就是区块链的基本思想。而区块链的故…...

input()函数——输入
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 input()函数可以提示并接收用户的输入,将所有的输入按照字符串进行处理,并返回一个字符串,input()函数的…...

CST 时间格式减去八小时
问题: 查看服务器时间是正确的,但输出出来的时间,比此时多出来八个小时。这里直接把时间减去八个小时。 public static void main(String[] args) throws ParseException {// 设定原始时间格式try {SimpleDateFormat dateFormat new SimpleDateFormat(&…...

植物大战僵尸杂交版技巧大全(附下载攻略)
《植物大战僵尸杂交版》为策略游戏爱好者带来了全新的挑战和乐趣。如果你是新手玩家,可能会对游戏中的植物和僵尸感到困惑。以下是一些实用的技巧,帮助你快速掌握游戏并享受其中的乐趣。 技巧一:熟悉基本玩法 游戏的基本玩法与原版相似&…...

HTTPS 代理的优点和缺点是什么?
HTTPS代理的优点包括提供更好的安全性、支持验证、速度、匿名性、节省带宽。 安全性:HTTPS代理通过使用SSL/TLS协议对传输的数据进行加密,保护用户的数据传输安全,防止中间人攻击和窃听,确保数据的安全性。 速度:HTTPS…...

Mac安装多版本node
Mac下使用n模块去安装多个指定版本的Node.js,并使用命令随时切换。 node中的n模块是,node专门用来管理node版本的模块,可以进行node版本的切换,下载,安装。 1.安装n npm install -g n 2.查看版本 n --version 3.展…...

HTML静态网页成品作业(HTML+CSS)——动漫猪猪侠网页(4个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有4个页面。 二、作品演示 三、代…...

【机器学习300问】125、什么是双向循环神经网络(BRNN)?什么是深度循环神经网络(DRNN)?
一、双向循环神经网络 (1)诞生背景 双向循环神经网络(Bidirectional Recurrenct Neural Network, BRNN)是在深度学习领域发展起来的一种特殊类型的循环神经网络(RNN),它诞生的背景是为了解决传…...

办公软件汇总
1、OCR 1.1 pearOCR pearOCR 是一个免费的免费在线文字提取OCR工具网站。PearOCR界面简洁,所有过程均在网页端完成,无需下载任何软件,点开即用。官方地址:https://pearocr.com/ 参考:9款文字识别(OCR)工具…...

Docker 搭建 MinIO 对象存储
Docker 搭建 MinIO 对象存储 一、MinIO MinIO 是一个高性能的对象存储服务器,用于构建云存储解决方案。MinIO 允许你存储非结构化数据(如图片、视频、日志文件等)以对象的形式。MinIO 提供简单的部署选项和易于使用的界面,允许你…...

主干网络篇 | YOLOv5/v7 更换骨干网络之 PP-LCNet | 轻量级CPU卷积神经网络
主干网络篇 | YOLOv5/v7 更换骨干网络之 PP-LCNet | 轻量级CPU卷积神经网络:中文详解 1. 简介 YOLOv5 和 YOLOv7 是目前主流的目标检测算法之一,具有速度快、精度高的特点。但 YOLOv5 和 YOLOv7 的原始模型结构中使用的是 MobileNetV3 作为骨干网络&am…...

CubeFS - 新一代云原生存储系统
CubeFS 是一种新一代云原生存储系统,支持 S3、HDFS 和 POSIX 等访问协议,支持多副本与纠删码两种存储引擎,为用户提供多租户、 多 AZ 部署以及跨区域复制等多种特性。 官方文档 CubeFS 作为一个云原生的分布式存储平台,提供了多种访问协议,因此其应用场景也非常广泛,下面…...

推动多模态智能模型发展:大型视觉语言模型综合多模态评测基准
随着人工智能技术的飞速发展,大型视觉语言模型(LVLMs)在多模态应用领域取得了显著进展。然而,现有的多模态评估基准测试在跟踪LVLMs发展方面存在不足。为了填补这一空白,本文介绍了MMT-Bench,这是一个全面的…...

深度学习31-33
1.负采样方案 (1)为0是负样本,负样本是认为构造出来的。正样本是有上下文关系 负采样的target是1,说明output word 在input word之后。 2.简介与安装 (1)caffe:比较经常用于图像识别,有卷积网…...

Docker多种场景下设置代理
20240623 - 公司内网环境下需要对Docker进行代理设置;此时需要对拉取镜像的时候的命令设置代理;例如平时经常使用的wget设置代理一样。但对docker进行设置,并不能简单的直接export。 文章[1]指出,拉取镜像的时候实际执行的是doc…...

node 实现导出, 在导出excel中包含图片(附件)
如果想查看 node mySql 实现数据的导入导出,以及导入批量插入的sql语句,连接如下 node mySql 实现数据的导入导出,以及导入批量插入的sql语句-CSDN博客https://blog.csdn.net/snows_l/article/details/139998373 一、效果如图: 二…...