在光线跟踪时减少计算

时间:2017-08-18 07:45:11

标签: intersection raytracing kdtree bounding-volume

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

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

  1. 为每个输出像素投射光线。
  2. 如果当前光线击中物体,请将输出像素颜色设置为"白色"
  3. 否则将其设为黑色
  4. 为了提高光线跟踪器的速度,我为每个实体添加了一个球形边界框。如果当前光线与边界框相交,它将与实体的每个三角形一起运行相交测试。

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

    因此,渲染一个大约10000个多边形的物体(1920x1080)需要5分钟以上,而且我觉得这不是我想要的。

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

    问候,芬恩

1 个答案:

答案 0 :(得分:2)

  

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

是。

听起来你的场景包含一个三角形列表,你可以在列表中线性迭代并检查每个三角形以找到最接近的三角形。这是线性搜索,具有O(n)运行时,n =三角形数。

您可以使用volumetric kd-treesbounding volume hierarchies存储三角形,将此时间缩短为O(log(n))次。就个人而言,我更喜欢kd-trees,但两种方法都适用。请注意,BVH通常在动画场景中表现更好。

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

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

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

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

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

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