我已经编写了自己的3D游戏引擎(我花了一年时间),我想创建一个在我的CPU上运行的Raytracer(不是GPU !!)
目前,光线跟踪过程简化如下:
为了提高光线跟踪器的速度,我为每个实体添加了一个球形边界框。如果当前光线与边界框相交,它将与实体的每个三角形一起运行相交测试。
我在光线三角形交叉点和光线点距离上使用最快的方法,但是每条光线仍然必须测试每个可能相交的实体的每个三角形。
因此,渲染一个大约10000个多边形的物体(1920x1080)需要5分钟以上,而且我觉得这不是我想要的。
有没有办法减少我需要检查的三角形数量?
问候,芬恩
答案 0 :(得分:2)
有没有办法减少我需要检查的三角形数量?
是。
听起来你的场景包含一个三角形列表,你可以在列表中线性迭代并检查每个三角形以找到最接近的三角形。这是线性搜索,具有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)。