2010-04-06 3 views
4

Я хочу, чтобы создать анимированный Перлин шум на iPhone, так что я в конечном итоге могу сделать что-то вроде этого: http://dl.dropbox.com/u/1977230/example.pngКак создать Перлин шум на iPhone

Я смотрел и смотрел, но ничего не может найти аналогичный или способ отображения шума Perlin.

Мне сказали посмотреть OpenGL ES, но даже поиск примера шума Perlin или эффекта лавы/плазмы не приводит ни к чему.

Я очень благодарен за помощь в этом вопросе.

Спасибо, ребята, Andre

ответ

10

Ну, первое исследование самого шума алгоритм Перлин. 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#>); 
    

    Если это неподвижное изображение, вы в порядке. если это оживление, это может быть не лучшее решение.

  • Ознакомьтесь с OpenGL ES на iPhone. Пример OpenGL ES для iPhone SDK - отличная отправная точка. Исследование текстуры отображения. Когда вы знакомы с glTexImage2D, используйте это для загрузки изображения.

    Пример может быть легко расширен следующим образом:

    эти устанавливает:

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

    затем в методе ESRenderer инициализации создает пространство для текстуры:

    - (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

Я вижу. Спасибо за это. Я все еще не могу поверить, что нет версии Perlin Noise для Objective-C/OpenGL ES ... – Andre

+1

Функции c и классы C++ могут использоваться в objc. – f3r3nc

6

Я начал проект с открытым исходным кодом на Github, который можно использовать для генерации шума Перлина. Он поддерживает полное 4-мерное (x, y, z, t) поколение Perlin. Он также включает проект с песочницей, чтобы играть с идеями текстуры. http://czgarrett.com/code/2011/05/18/perlin-noise-generator-for-ios.html

Смежные вопросы