4

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

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

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

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

谢谢大家, 安德烈

4

3 回答 3

10

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

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

基本上有两种选择。

  • 创建一个 UIView 子类并覆盖 draw:(CGRect) 方法。明智地使用将 RGB 数据转换为 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);   
    

啊,我想念那个好老的视频是 000 美元天 :)

于 2010-04-07T02:57:38.233 回答
6

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

于 2011-05-19T01:18:44.830 回答
2

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

于 2011-06-02T13:58:15.900 回答