Como gerar ruído perlin em um iPhone
-
24-09-2019 - |
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
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.