Pergunta

Quero criar um ruído de perlin animado no iPhone, para que eu possa fazer algo assim: http://dl.dropbox.com/u/1977230/example.png

Eu olhei e olhei, mas não consigo encontrar nada semelhante ou uma maneira de realmente exibir um ruído de perlin.

Disseram -me para olhar para o OpenGL ES, mas mesmo procurar um exemplo de ruído de perlin ou um efeito de lava/plasma não resulta em nada.

Eu realmente apreciaria alguma ajuda neste.

Obrigado pessoal, Andre

Foi útil?

Solução

Bem, primeiro estude o próprio algoritmo de ruído de Perlin. http://en.wikipedia.org/wiki/perlin_noise Parece apenas o melhor lugar para decolar.

Depois de ter os dados do seu efeito RGBA, a coisa desagradável começa.

Existem duas opções basicamente.

  • Crie uma subclasse UIView e substitua o método Draw: (CGrect). Usar Convertendo dados RGB em um bitmap em cacau Objective-C ++ Sabiamente para criar um cGimage a partir de seus dados e desenhar essa imagem para o contexto atual no desenho.

    CGContextDrawImage(UIGraphicsGetCurrentContext(), <#CGRect rect#>, <#CGImageRef image#>);
    

    Se esta é uma imagem estática, você está bem. Se estiver animando, essa pode não ser a melhor solução.

  • Familiarize -se com o OpenGL ES no iPhone. O exemplo do OpenGL ES do iPhone SDK é um excelente ponto de partida. Estudo mapeamento de textura. Depois de familiarizar -se com o GLTIXAGE2D, use isso para carregar sua imagem.

    O exemplo pode ser facilmente estendido com o seguinte:

    Estes definem:

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

    Então, no método de Essererer init, crie espaço para a textura:

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

    Caso o ruído seja atualizado periodicamente, atualize a textura no método de renderização

            - (void) render { .....
    glBindTexture(GL_TEXTURE_2D, spriteTexture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);   
    

Ah, sinto falta do bom e velho vídeo está em US $ a000 dias :)

Outras dicas

Comecei um projeto de código aberto no Github que você pode usar para gerar ruído perlin. Ele suporta geração completa 4-dimensional (x, y, z, t) perlin. Ele também inclui um projeto com um aplicativo de sandbox para jogar com idéias de textura. http://czgarrett.com/code/2011/05/18/perlin-noise-generator-for-ios.html

Agora, há outra função de ruído de Perlin para o Shader GLSL que não requer texturas de pesquisa: https://github.com/ashima/webgl-isee/tree/master/src. Isso deve funcionar em iPhones.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top