Как создать Perlin Noise на iPhone

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

Я искал и искал, но не могу найти ничего похожего или способа действительно отобразить шум Перлина.

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

Я был бы очень признателен за помощь в этом.

Спасибо, ребята, Андре


person Andre    schedule 06.04.2010    source источник


Ответы (3)


Ну, сначала изучите сам алгоритм Perlin Noise. http://en.wikipedia.org/wiki/Perlin_noise выглядит лучшим местом для выключенный.

Как только у вас есть данные RGBA этого вашего эффекта, начинается неприятная вещь.

Есть два варианта в основном.

  • Создайте подкласс UIView и переопределите метод draw:(CGRect). Используйте Преобразование данных RGB в растровое изображение в 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);   
    

Ах, я скучаю по старому доброму видео, которое стоит 1000 долларов в день :)

person f3r3nc    schedule 07.04.2010
comment
Я понимаю. Спасибо за это. Я до сих пор не могу поверить, что нет версии Perlin Noise для Objective-C/OpenGL ES... - person Andre; 07.04.2010
comment
функции c и классы c++ можно использовать в objc. - person f3r3nc; 07.04.2010

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

person Chris Garrett    schedule 19.05.2011

Теперь есть еще одна функция шума Perlin для шейдера GLSL, которая не требует поисковых текстур: https://github.com/ashima/webgl-noise/tree/master/src. Это должно работать на iPhone.

person LarsH    schedule 02.06.2011