3

我过去曾在 C++ 中使用过(非常基本的)光线追踪软件。现在想从头开始创建一个高级系统(CSG、radiosity 等)。

我发现在 Haskell 中实现它很有趣,因为我也在学习函数式编程。

性能是光线追踪算法中一个非常重要的事实。Haskell 程序通常比 C++ 程序慢。多少?这取决于上下文。

考虑到这种情况(即潜在的非常复杂的 RT)在 Haskell 中工作是否可行?

4

2 回答 2

7

可能值得检查一下 Repa 的平面并行性。如果您知道自己在做什么,您可以获得相当不错的性能,但为了获得出色的性能,有时可能需要读取和检查核心输出以了解为什么没有拆箱。

不过,这取决于。如果您正在编写 C 代码以获得绝对性能,那么您很可能不会用 Repa击败C,因为目前别名分析似乎不是很好。但是,除非您将 C 代码手动融合到一个单一的函数中,否则我怀疑您从融合中获得的好处以及 Repa 中的“自由并行性”可能会帮助它竞争。

http://code.ouroborus.net/gloss/gloss-head/gloss-examples/raster/Ray/

http://www.youtube.com/watch?v=jBd9c1gAqWs

并且不要使用列表。如果你不想使用 Repa,我建议你使用 Data.Vector.Unboxed。

于 2013-07-03T02:10:56.157 回答
3

我对 Haskell 也比较陌生。我刚刚在https://bitbucket.org/ratzes/hray/src提交了一个四元数分形光线追踪器到用 Haskell 编写的 bitbucket 。

该代码并不完美,但它相当小,并且在示例文件夹中生成了图像。

我使用了 Repa 库(这里有关于 Repa 的很好的教程),我认为它非常适合我的光线追踪程序。它允许我指定一个函数来计算特定光子的“命中”,然后它会自动将该函数并行化到每个光子上。

不可否认,分形光线追踪比一般光线追踪更容易,因为您可以在“光子”路径上的任何点进行采样以询问它是否发生碰撞。此外,没有实现任何先进的东西,如辐射度或焦散,所以我无法评论这些规模的效果。

于 2013-07-03T02:27:36.210 回答