屏幕绘图上的像素非常快

时间:2015-04-06 22:02:12

标签: swift shader mandelbrot

我的一个朋友不得不用c中的opengl绘制一个mandelbrot。我决定在Swift中这样做。

我尝试的第一种方法是创建一个带有ARGB数据的数组,并将其转换为CGImage并在UIImageView中查看该数据。然而,这还不够快。

现在我想知道,在屏幕上绘制单个像素的最快方法是什么。我看着Metal,但这似乎主要是关于三角形和3d的东西。然后我来到scenekit着色器(.fsh),并认为这可能是一个很好的解决方案。但是我想也能够放大mandelbrot分形,我找不到在我的mandelbrot中输入变量的方法(我的参考:https://www.weheartswift.com/fractals-xcode-6/

你能告诉我/给出一个例子(Swift请)以最快的方式绘制单个像素,或者至少一种方法将原始像素绘制到屏幕上而不必使用像CGImage那样的中间件吗?

2 个答案:

答案 0 :(得分:2)

不是使用顶点和片段着色器,而是使用内核函数(或计算着色器)。这将是一个单一着色器,用于处理数学并在纹理的每个像素处设置颜色值。然后,您可以使用CAMetalLayer将纹理渲染到屏幕。

看一下这篇博客文章,我使用传递给内核函数的粒子坐标写入纹理:http://flexmonkey.blogspot.co.uk/2015/03/swift-metal-four-million-particles-on.html

答案 1 :(得分:0)

如果你想在GPU上计算分形,那么这比Swift问题更像是一个OpenGL(或金属)问题。您需要采取更小的步骤:

  1. 使用OpenGL在屏幕上获得一个纯色三角形。
  2. 在屏幕上填充两个纯色三角形。
  3. 使用片段着色器使用简单渐变填充三角形。
  4. 使用简单的纹理填充三角形。
  5. 执行两阶段绘制:绘制到屏幕外缓冲区(带有三角形和着色器),然后使用该缓冲区作为纹理在屏幕上绘制。
  6. 使用着色器将分形画面绘制到离屏缓冲区。
  7. 请注意,第6步可能很难,您可能需要帮助,但在成功完成步骤1-5之前,即使启动它也没有意义。您应该能够找到许多教程来帮助您完成步骤1-5,但您可能需要将它们从C,C ++或Objective-C转换为Swift。

    您链接的页面完全跳过步骤1-5,因为Xcode场景查看器会为您完成这些操作。如果您想编写独立应用程序,则需要了解如何执行这些步骤。