首页 > 解决方案 > 如何使用光泽加速渲染 mandelbrot

问题描述

作为一个练习,我正在尝试使用 Haskell 渲染 Mandelbrot 集。我正在使用光泽度来显示结果。到目前为止,我的数学是正确的,并且显示作品。目前,我生成了一个 [[Word8]],它表示每个像素运行到无穷大所需的迭代,并将其转换为 ByteString,我用它来构建光泽图片,并显示出来。它工作得很好,花花公子,分辨率高达 100 像素的宽度和高度,它运行得相当快,但它需要很长时间。因此,为了改变这一点,我现在尝试使用加速来使用 GPU 进行渲染,但我只是不知道该怎么做。它从使用什么库开始。平原加速?光泽加速?光泽光栅加速?我想,我必须使用最后一个。在 Graphics.Gloss.Accelerate.Raster 模块中。

有人可以向我解释 makePicture 功能,或者至少将我指向某个更解释的地方。一个工作示例,我可以根据我的情况进行调整会很好。

标签: haskellglossaccelerate-haskell

解决方案


您可以从 Accelerate的github 示例目录中查看 mandelbrot 示例。那个使用加速和加速光泽包。要了解如何在 Accelerate 中对 Mandelbrot 进行编程,请参阅本教程

并且更具体的关于makePicture 功能的问题。

它有 5 个参数

  1. 第一个表明Render给定的世界应该如何加速。使用 GPU 时,应从run1包中使用accelerate-llvm-ptx
  2. 整数像素宽度。
  3. 以整数表示的像素高度。
  4. 创建类型为 的图像的函数Arrays world => (Acc world -> Acc (Array DIM2 Colour))。因此,给定一个带有一些参数的函数,其中参数应该是 Accelerate Arrays。在您的情况下可能是一个标量元组,因此您可以指示要显示的图像的范围。结果数组是一个需要类型的矩阵Colour(4 个浮点数的元组)。我的猜测是生成的数组的尺寸应该与您作为参数提供的像素宽度和像素高度相对应。
  5. 未提升的world(即没有Acc在它前面)。赋予第四个参数的函数的参数。

之后,它应该产生一个 Gloss Picture


推荐阅读