2017-08-18 45 views
0

我写我自己的3D游戏引擎(我花了一年),我想创造我的CPU上运行的光线跟踪(而不是GPU!)减少计算而光线追踪

就目前而言,射线追踪过程如下简化:

  1. 为每个输出像素投射射线。
  2. 如果当前射线碰到物体,设置输出像素的颜色为“白色”
  3. 否则设置为黑色

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

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

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

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

问候,芬兰人

+0

你的问题是一个广泛的问题,但我可以给你一些指示。有很多关于光线追踪(计算机视觉)的论文,文章,......。您可以对此主题进行一些研究。有各种各样的方法和方法。 – KarelG

+0

所以你基本上是说有一种方法可以减少多边形的数量,而不是条目的数量。我会试一试:)谢谢 – Luecx

+0

你现在正在进入加速度数据结构,主要是Bounding Volume Hierarchy和K-d树。你可以在这个主题上找到大量关于sciencedirect和ieee上k-d树遍历的研究论文。 –

回答

1

有没有减少,我需要检查三角形的量的方法吗?

是的。

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

您可以通过使用volumetric kd-treesbounding volume hierarchies存储您的三角形,从而减少该平均O(log(n))时间。就个人而言,我更喜欢kd-trees,但任何一种方法都可行。请注意,BVH通常在动画场景中表现更好。

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

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

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

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

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

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

+0

我见过KD-Trees,但是在两个新创建的盒子之间的分割上正确的三角形会发生什么? – Luecx

+0

你必须决定如何处理边缘情况:)有优点和缺点,但最重要的是保持一致。 –

+0

我昨天实施了KD-Tree,我可以从40000-1000减少我的三角形数量。这真的很好,但不是很好。这是因为我的边缘情况。现在我决定在节点中保留我的边三角形,而不是让它们失效。这导致我的第一个节点有500个三角形,但我很好:)非常感谢你:) – Luecx