2010-04-06 56 views
4

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

我看了又看,却找不到任何东西类似或实际显示佩林噪声的方法。

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

我真的很感谢这一个帮助。

谢谢你们, 安德烈

回答

10

嗯,首先研究柏林噪声算法本身。 http://en.wikipedia.org/wiki/Perlin_noise看起来只是最好的起飞地点。

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

基本上有两种选择。

  • 创建一个UIView子类并重写绘制:(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天:)

+0

我明白了。感谢那。 我仍然无法相信Objective-C/OpenGL ES中没有Perlin Noise的版本...... – Andre 2010-04-07 10:31:30

+1

c函数和C++类可以在objc中使用。 – f3r3nc 2010-04-07 10:58:42