【问题标题】:How to generate Perlin Noise on an iPhone如何在 iPhone 上生成 Perlin 噪声
【发布时间】:2010-04-06 10:57:08
【问题描述】:

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

我看了又看,但找不到任何类似的东西或实际显示 Perlin Noise 的方法。

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

非常感谢您对此提供的帮助。

谢谢各位, 安德烈

【问题讨论】:

    标签: iphone ios xcode perlin-noise


    【解决方案1】:

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

    一旦你有了这个效果的RGBA数据,麻烦的事情就开始了。

    基本上有两种选择。

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

      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 天播放的好老视频 :)

    【讨论】:

    • 我明白了。感谢那。我仍然不敢相信没有针对 Objective-C / OpenGL ES 的 Perlin Noise 版本......
    • c 函数和 c++ 类可以在 objc 中使用。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-09-27
        • 2011-06-12
        • 2017-07-16
        • 2012-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-30
        • 2013-06-30
        相关资源
        最近更新 更多