我在D(http://dsource.org/projects/stacy)中编写了一个相对简单的raytracer / path跟踪器,但是即使进行了全面优化,每条射线仍需要数千个处理器周期。我还有什么其他办法可以加快速度吗?更笼统地说,您知道射线追踪的良好优化/更快方法吗?

编辑:这就是我已经在做的。

  • 代码已经在高度并行运行
  • 临时数据以高速缓存有效的方式进行结构化,并与16b
  • 对齐
  • 屏幕分为32x32-tiles
  • 目标数组的排列方式是,瓦片中的所有后续像素在内存中是顺序的
  • 执行基本场景图优化
  • 对象的常用组合(如方框所示的平面CSG)已替换为预先优化的对象
  • 能够利用GDC的自动矢量化支持的Vector结构
  • 通过惰性评估找到射线的后续命中;这可以防止对CSG
  • 进行不必要的计算
  • 三角形不支持也不优先。仅普通图元,以及CSG操作和基本 Material 属性
  • 支持边界
  • 最佳答案

    光线跟踪器速度的典型一阶改进是某种空间分区方案。仅基于您的项目大纲页面,看来您还没有这样做。

    可能最常用的方法是八叉树,但最好的方法可能是方法的组合(例如,空间分区树和类似邮箱的事物)。边界框/球体测试是一种快速廉价且令人讨厌的方法,但您应该注意两点:1)在许多情况下它们没有多大帮助; 2)如果您的对象已经是简单的基元,那么您将不会获得太多 yield (甚至可能会失败)。您可以更容易(比octree更好)实现用于空间分区的常规网格,但是它仅对稍微均匀分布的场景(就表面位置而言)非常有效

    很大程度上取决于您表示的对象的复杂性,内部设计(即是否允许局部变换,对象的引用副本,隐式曲面等)以及您要达到的精度。如果要编写具有隐式曲面的全局照明算法,则权衡可能与为网格物体或其他对象编写基本的raytracer时有所不同。我没有详细研究您的设计,因此不确定您是否已经想到了上面的内容。

    像任何性能优化过程一样,您将必须首先进行度量以找到实际花费时间的地方,然后进行改进(按需优先选择算法,然后根据需要进行代码填充)

    08-28 01:36