我过去曾在C ++中使用(非常基本的)光线跟踪软件。 现在想要从头开始创建一个高级系统(CSG,光能传递等)。
我觉得有趣的是在Haskell中实现它,因为我也在学习函数式编程。
性能是光线跟踪算法中非常重要的事实。 Haskell程序通常比C ++程序慢。多少?这取决于具体情况。
考虑这个上下文(即可能非常复杂的RT)在Haskell中工作是否可行?
答案 0 :(得分:7)
值得检查平面并行度的修复。如果你知道自己在做什么,就可以获得相当不错的性能,但为了获得出色的性能,它有时需要阅读并检查核心输出,看看为什么没有拆箱。
但是,这取决于。如果您正在为绝对性能编写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。
答案 1 :(得分:3)
我对Haskell也相对较新。我刚才在https://bitbucket.org/ratzes/hray/src在Haskell写的bitbucket中提交了一个四元数分形光线跟踪器。
代码并不完美,但它相当小,并且在samples文件夹中生成了图像。
我使用了Repa库(很好的修复here教程),在我看来这对于我的光线追踪程序是完美的。它允许我指定一个函数来计算特定光子的“命中”,然后它自动将该函数并行化在每个光子上。
不可否认,分形光线跟踪比普通光线跟踪更容易,因为您可以在“光子”路径上的任何点进行采样,以询问它是否发生碰撞。此外,没有实现任何像光能传递或焦散这样的先进技术,所以我无法评论那些像那些规模那么好的。