0

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

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

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

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

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

结果,我用大约 10000 个多边形渲染一个对象 (1920x1080) 需要超过 5 分钟,我认为这不是我想要的。

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

问候,芬恩

4

1 回答 1

2

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

是的。

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

O(log(n))您可以通过使用体积 kd-trees边界体积层次结构来存储您的三角形,将其减少到平均时间。就个人而言,我更喜欢 kd-trees,但任何一种方法都有效。请注意,BVH 通常在动画场景中表现更好。

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

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

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

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

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

还有其他加速结构,如网格(又名体素)

于 2017-08-22T21:41:11.640 回答