Haskell中的光线追踪

3

我曾经在C ++中使用一个非常基本的光线跟踪软件工作。

现在我想要从头开始创建一个高级系统(CSG、辐射度等)。

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

性能是光线跟踪算法中非常重要的因素。一般来说,Haskell程序比C ++程序运行得慢。它的缓慢程度取决于具体情况。

考虑到这种情况(即可能非常复杂的RT),使用Haskell工作是否可行?


是的,这是可行的,Haskell中已经有许多光线追踪器(在Hackage和其他地方都有)。如果您想得到一个好的答案,您应该让您的问题更加精确。 - Thomas M. DuBuisson
是的,存在高性能的Haskell光线追踪器。这是一个合法的语言选择。然而,如果你是Haskell的初学者并且已经了解C ++,那么你写出来的C ++比Haskell更好/更快。 - daniel gratzer
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。


3

我也是Haskell的新手。不久前,我在Haskell中编写了一个四元数分形光线追踪器,并将其提交到了bitbucket上,网址为https://bitbucket.org/ratzes/hray/src

代码并不完美,但它相当小,并生成了示例文件夹中的图片。

我使用了Repa库(有关Repa的详细教程请参见此处),在我看来,它非常适合我的光线追踪程序。它允许我指定一个函数来计算特定光子的“撞击”,然后自动将该函数并行化到每个光子上。

诚然,分形光线追踪比通用光线追踪更容易,因为你可以在“光子”路径上的任何点进行采样以询问是否发生碰撞。此外,我没有实现像辐射度或焦散这样的高级功能,因此无法评论这些功能的扩展性如何。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接