我曾经在C ++中使用一个非常基本的光线跟踪软件工作。
现在我想要从头开始创建一个高级系统(CSG、辐射度等)。
我发现用Haskell实现很有趣,因为我也在学习函数式编程。
性能是光线跟踪算法中非常重要的因素。一般来说,Haskell程序比C ++程序运行得慢。它的缓慢程度取决于具体情况。
考虑到这种情况(即可能非常复杂的RT),使用Haskell工作是否可行?
我曾经在C ++中使用一个非常基本的光线跟踪软件工作。
现在我想要从头开始创建一个高级系统(CSG、辐射度等)。
我发现用Haskell实现很有趣,因为我也在学习函数式编程。
性能是光线跟踪算法中非常重要的因素。一般来说,Haskell程序比C ++程序运行得慢。它的缓慢程度取决于具体情况。
考虑到这种情况(即可能非常复杂的RT),使用Haskell工作是否可行?
如果涉及到平行计算,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。
我也是Haskell的新手。不久前,我在Haskell中编写了一个四元数分形光线追踪器,并将其提交到了bitbucket上,网址为https://bitbucket.org/ratzes/hray/src。
代码并不完美,但它相当小,并生成了示例文件夹中的图片。
我使用了Repa库(有关Repa的详细教程请参见此处),在我看来,它非常适合我的光线追踪程序。它允许我指定一个函数来计算特定光子的“撞击”,然后自动将该函数并行化到每个光子上。
诚然,分形光线追踪比通用光线追踪更容易,因为你可以在“光子”路径上的任何点进行采样以询问是否发生碰撞。此外,我没有实现像辐射度或焦散这样的高级功能,因此无法评论这些功能的扩展性如何。