- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经编写了一个基于标准算法的光线转换算法。交点是使用 Möller-Trumbore 算法计算的(与更简单的算法相比,该算法将执行时间减少了约 350%)。
总体执行以下步骤:
我不需要不同的阴影变化;三角形只需要保存信息,无论它们是否被着色( bool 值)。
问题是对于第 2 步,我需要对场景中的所有三角形进行相交检查。换句话说,时间复杂度是 O(n²)。然而,我已经读到有可能有一个时间复杂度为 O(log n) 的光线转换算法。
我有一些减少执行时间的想法。例如,我可以从计算中排除所有与光源的距离大于光线射向的三角形,这可能会减少 50% 的执行时间。但是复杂度仍然是 O(n²),并且在处理大量日期时不会有太大帮助。
例如,在具有 100.000 的场景上使用光线追踪算法仍然是可能的,但需要大约 10 分钟,并且当场景包含更多三角形时,该数量将呈指数增长。
有没有办法在不从根本上改变算法工作方式的情况下将时间复杂度降低到较低的复杂度级别?
编辑:我已经实现了 @meowgoesthedog 建议的边界体积层次结构 (BVH) 版本。三角盒相交实现起来有点棘手,但除此之外,它背后的理论很容易理解。
我试过不同数量的分区和子分区,结果差异很大,但在大多数情况下,光线转换的性能要好得多。没有通用的最佳配置,因此为不同的对象/场景尝试不同的数字是有意义的。在我的例子中,4/2(将房间分成 4*4*4 个边界框,每个边界框包含 2*2*2 个子框,即 64 个框,每个框有 8 个内部框)、5/2 和 6/2 通常表现良好,尽管对于某些对象,非分层分区效果最好(例如 10/0)。
所需的射线-三角形相交测试的数量最多可减少 97%(可能更多),但更高级别的分区会使边界框/AABB 的创建成本相当高。如果配置良好,程序的执行速度比没有边界体积的解决方案快 4 倍。在具有大量三角形(超过 10000 个)的场景中可以更好地看到更好的性能。
但是,我的实现仍然相对幼稚,而且我确信还有很大的改进空间。如果我得到好的结果,我会继续修补并更新这篇文章!
最佳答案
这取决于您所说的“从根本上改变”它的工作方式是什么意思。如果您的意思是不改变其行为,即它的输出结果和准确性,那么可以。
这样做的方法是使用空间层次结构数据结构;这将以指数的方式减少搜索空间,为您提供对数时间复杂度。三种最常用的此类结构是:1. Octrees,2. Boundary-Volume Hierarchies (BVH),以及 3. KD-trees>.
八叉树很容易构造,但内存效率或性能不如其他八叉树。 KD 树很难很好地构建,但内存效率更高,并提供最快的交叉时间。 BVH 介于两者之间。
对于 KD 树,this是一个很好的起点; this document在光线追踪社区中广为人知,非常适合进一步研究。
(另一种结构是著名的二进制空间分区 (BSP)。这提供了比上述所有三种更好的性能。但是,构建最佳 BSP 树对于一次性光线追踪渲染来说成本太高。)
为了让您了解即使是简单的实现也能带来的潜在 yield ,我在自己的光线追踪项目中使用了 KD 树。在 1920x1080 分辨率下,使用 100K 三角形模型、简单的 Lambertian 着色和每像素 100 个样本,渲染仅需 7 秒。我尝试了朴素的 O(n) 算法,每个像素只有 1 个样本,分辨率为 320x240,耗时 10 分钟。
关于algorithm - 降低光线转换算法的 O(n²) 时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45896293/
我在堆栈上创建了这段代码: function increase_brightness(hex, percent){ var r = parseInt(hex.substr(1, 2), 16)
为什么我能够LOWER COALESCE 中的每个项目,但无法LOWER整个COALESCE,否则我会遇到语法错误?例如: SELECT COALESCE(LOWER(google_provider_
我在谷歌上搜索到的所有内容都表明,以下任何一项都会将 double 舍入到小数点后两位。 double roundToFourDecimals(double d) { DecimalForma
我正在开发一个 flexdashboard/storyboard,我想在其中降低每个帧的高度。那可能吗? 示例代码: --- title: "Flex" output: flexdashboard
我在 WPF 中有一个图像控件。我需要减小图像尺寸控件的宽度和高度。但是当我这样做时,图像看起来不太好。数据丢失更多。 所以我想降低图像分辨率而不是仅仅改变图像控件的宽度和高度。 任何人都可以帮助我如
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 1年前关闭。 Improve this
我正在扩展 Fluent NHibernate,以便更好地与 F# 一起使用(即引用支持),并希望获得一些关于降低 API 流畅性的反馈。 F# 要求使用返回值,除非它们是单位类型。所以这最终以“|>
我们有一个 BizTalk 2010 接收位置,它将获取一个 70MB 的文件,然后使用入站映射(在接收位置)和出站映射(在发送端口)生成一个 1GB 文件。 执行上述过程时,SQL Server 会
我的代码分析插件提示包含以下代码的方法中的代码复杂性。我注意到以下代码看起来可以组合,但我不知道如何做到这一点: for(Command command : commands) { if (c
我正在寻找一种方法来始终忽略 R 中 float 之间的微小差异(根据 IEC 60559,这些是 double 浮点),通过使用基本 R 工具而不诉诸 C 或 C++。换句话说,我想“四舍五入” d
在 Blazor 中使用 ChartJs.Blazor 的 BarChart 组件时是否可以降低甚至关闭动画速度?我发现这个 NuGet 包非常有用,但我不知道如何在更新条形图时关闭动画。为了更容易忽
所以我为一个游戏编写了这段代码,现在该游戏的速度非常快。我想降低 FPS,让游戏慢一点。 我认为我唯一的出路就是制作一个计时器。但我发现很难找到放置计时器的位置?谁能帮我解决这个问题吗? 所以我为一个
我正在编写一个程序,我担心它运行所需的时间和所占用的空间。 在程序中我使用了一个变量来存储数组的长度: int len=newarray3.length; 现在,我想知道是否能够通过不使用 len 变
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 2 年前。 Improve th
我用Java编写了一个程序,但它的计算时间很长,我不知道为什么。有人可以指点一下以降低复杂性吗?此外,在计算一些值(例如 3,100 之后)后,它会给出空指针异常。代码: public class F
我有下图,由 1 行 2 列的网格组成。我愿意 降低右侧子图的高度(3D PREDICTION),使棋盘平面看起来有点挤压并显示更好的视角。 在左侧子图的顶部添加一些边距(2D PREDICTION)
是否有一种简单的方法可以更改以 RGB 字符串形式给出的颜色的亮度? 例如 in_RGB = '#FF0000' --> out_RGB = '#CC0000' 最佳答案 将十六进制字符串转换为 R
我已经编写了代码来更改对象(不是进程)(在本例中是文件)的完整性级别。据我们所知,我们从中等完整性级别开始,但我想将其降低到“低”。我想运行完整性较低的 .txt 文件而不是默认介质。 我使用 WIN
是否可以在保持原始宽高不变的情况下降低图像分辨率? 我已经使用 BitmapFactoryOptions 尝试了几个选项: 在样本大小 inDensity、inScaled、inTargetDensi
是否有高级(Java)或低级方式(使用 native 代码)将 Android 设备上的蓝牙信号强度更改为最低? 目标是使设备在 20 厘米范围内可被发现?在 Internet 上根本找不到与此相关的
我是一名优秀的程序员,十分优秀!