减少光线追踪时的计算

Posted

技术标签:

【中文标题】减少光线追踪时的计算【英文标题】:Reduce calculations while Raytracing 【发布时间】:2017-08-18 07:45:11 【问题描述】:

我已经编写了自己的 3D 游戏引擎(我花了一年时间),我想创建一个在我的 CPU(而不是 GPU)上运行的光线追踪器!

目前,光线追踪过程简化如下:

    为每个输出像素投射一条光线。 如果当前光线击中一个物体,将输出像素颜色设置为“白色” 否则设置为黑色

为了提高光线追踪器的速度,我为每个实体添加了一个球形边界框。如果当前光线与边界框相交,它将对实体的每个三角形运行相交测试。

我在射线三角形交点和射线点距离上使用最快的方法,但每条射线仍然必须测试每个可能相交的实体的每个三角形。

因此,我需要 5 多分钟来渲染一个具有大约 10000 个多边形的对象 (1920x1080),我认为这不是我想要的。

有什么方法可以减少我需要检查的三角形数量吗?

你好,芬恩

【问题讨论】:

你的问题很笼统,但我可以给你一些建议。有很多关于光线追踪(计算机视觉)的论文工作、文章……。您可以对这个主题进行一些研究。有多种方法,每种方法各有优缺点。 所以你基本上是说有一种方法可以减少多边形的数量而不是条目的数量。我会试一试:) 谢谢 您现在正步入加速数据结构领域,主要是 Bounding Volume Hierarchy 和 K-d 树。你可以在 sciencedirect 和 ieee 上找到很多关于这个主题的研究论文,特别是与 k-d 树的遍历有关。 您现在正步入加速数据结构领域,主要是 Bounding Volume Hierarchy 和 K-d 树。你可以在 sciencedirect 和 ieee 上找到很多关于这个主题的研究论文,特别是与 k-d 树的遍历有关。 【参考方案1】:

有什么方法可以减少我需要检查的三角形数量吗?

是的。

听起来您的场景由三角形列表组成,您正在线性迭代列表并检查每个三角形以找到最接近的三角形。这是线性搜索,运行时间为O(n),n = 三角形数。

您可以通过使用volumetric kd-trees 或bounding volume hierarchies 来存储您的三角形,将其缩短为平均O(log(n)) 时间。就个人而言,我更喜欢 kd-trees,但任何一种方法都有效。请注意,BVH 通常在动画场景中表现更好。

请注意,加速结构在构造或遍历方式中可能包含细微的错误,因此您可能需要开发一些方法来使用朴素列表方法(用于参考图像)和结构化方法来渲染相同的场景。在我的爱好追踪器中,我是这样组织的:

AbstractScene - 所有场景类型的基类。大多数代码只与AbstractScene 字段和方法交互。

KDScene - 将场景实现为 kd-tree 的派生类。

BVHScene - 将场景实现为 BVH 的派生类。

NaiveScene - 将场景实现为三角形列表的派生类。

还有其他加速结构,如grids (aka voxels)。

【讨论】:

我见过 KD-Trees,但是正好在两个新创建的盒子之间的分割处的三角形会发生什么? 你必须决定如何处理边缘情况 :) 有利有弊,但最重要的是要保持一致。 我昨天实现了 KD-Tree,我可以将三角形数量从 40000 减少到 1000。这真的很好但不是很好。这是因为我的边缘情况。现在我决定将我的边三角形保留在节点中,而不是将它们传递下去。这导致我的第一个节点有 500 个三角形,但我对此很好 :) 非常感谢 :)

以上是关于减少光线追踪时的计算的主要内容,如果未能解决你的问题,请参考以下文章

计算机视觉图像处理面试笔试题整理——光线追踪&光线投射&路径追踪

实现光线追踪

光线追踪遮挡计算(中心投影)

球体光线追踪

为啥在我的光线追踪器中计算阴影和反射时会丢失细节

2 追踪光线=》2.1