如何在iPhone上生成Perlin Noise

时间:2010-04-06 10:57:08

标签: iphone ios xcode perlin-noise

我想在iPhone上创建一个动画的perlin噪音,所以我最终可以这样做:http://dl.dropbox.com/u/1977230/example.png

我看了看,但找不到任何类似或实际显示Perlin噪音的方法。

我被告知要查看OpenGL ES,但即使是搜索Perlin噪音或熔岩/等离子效应的例子也不会产生任何结果。

我真的很感激这方面的一些帮助。

谢谢你们, 安德烈

3 个答案:

答案 0 :(得分:10)

好吧,首先研究Perlin Noise算法本身。 http://en.wikipedia.org/wiki/Perlin_noise看起来只是起飞的最佳地点。

一旦你获得了你的这种效果的RGBA数据,就会开始讨厌的事情。

基本上有两种选择。

  • 创建一个UIView子类并覆盖draw:(CGRect)方法。明智地使用Converting RGB data into a bitmap in Objective-C++ Cocoa从您的数据创建CGImage,并在绘图中将该图像绘制到当前上下文。

    CGContextDrawImage(UIGraphicsGetCurrentContext(), <#CGRect rect#>, <#CGImageRef image#>);
    

    如果这是静止图像,你没问题。如果它是动画,这可能不是最好的解决方案。

  • 熟悉iPhone上的OpenGL ES。 iPhone SDK的OpenGL ES示例是一个很好的起点。 研究纹理映射。熟悉glTexImage2D后,使用它来加载图像。

    可以使用以下内容轻松扩展该示例:

    有这些定义:

      GLuint spriteTexture;
      GLubyte *spriteData;  // the perlin noise will be here
      size_t    width, height;
    

    然后在ESRenderer init方法中为纹理创建空间:

    - (id) init { ....
    width = 512;  // make sure the texture size is the power of 2
    height = 512;
    
    glGenTextures(1, &spriteTexture);       
    glBindTexture(GL_TEXTURE_2D, spriteTexture);        
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);       
    //free(spriteData); // free this if not used any more
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);   
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);         
    

    如果定期更新噪音,请在渲染方法中更新纹理

            - (void) render { .....
    glBindTexture(GL_TEXTURE_2D, spriteTexture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);   
    

啊,我想念好的旧视频是在$ A000天:)

答案 1 :(得分:6)

我在Github上开始了一个开源项目,你可以用它来产生Perlin噪音。它支持完整的4维(x,y,z,t)Perlin生成。它还包括一个带有沙盒应用程序的项目,可以使用纹理创意。 http://czgarrett.com/code/2011/05/18/perlin-noise-generator-for-ios.html

答案 2 :(得分:2)

现在GLSL着色器还有另一个Perlin噪声函数,它不需要查找纹理:https://github.com/ashima/webgl-noise/tree/master/src。这适用于iPhone。