O ruído de Perlin com opengl
-
27-09-2019 - |
Pergunta
Eu estava estudando o ruído de Perlin através de alguns exemplos @ http://dindinx.net/opengl/index.php?menu=exemples&submenu=shaders e não pôde deixar de notar que ele make3DNoiseTexture()
dentro perlin.c
usos noise3(ni)
ao invés de PerlinNoise3D(...)
Agora, por que isso? O ruído de Perlin não deveria ser um somatório de diferentes frequências de ruído e amplitudes?
Qestion 2 é o que faz ni, inci, incj, inck
apoiar? Por que usar ni
em vez de x, y coordenadas? Por que é ni
incrementado com
ni[0]+=inci;
inci = 1.0 / (Noise3DTexSize / frequency);
Vejo Hugo Elias criou seu perlin2d com coordenadas X, Y, e o Perlinnoise3D (...).
Desde já, obrigado :)
Solução
Agora entendo o porquê e vou responder minha própria pergunta na esperança de que isso ajude outras pessoas.
O ruído de Perlin é na verdade uma síntese de ruídos de gradiente. Em seu processo de produção, devemos calcular o produto DOT de um vetor apontando de um dos cantos pisando o ponto de entrada para o próprio ponto de entrada com o vetor de gradiente gerado aleatório.
Agora, se o ponto de entrada fosse um número inteiro, como as coordenadas XYZ de uma textura que você deseja criar, o produto DOT sempre retornaria 0, o que lhe daria um ruído plano. Então, em vez disso, usamos inci, incj, inck
como um índice alternativo. Sim, apenas um índice, nada mais.
Agora retornando à pergunta 1, existem dois métodos para implementar o ruído de Perlin:
1.Calcular os valores de ruído separadamente e armazená -los nos slots RGBA na textura
2.Synthesize os ruídos anteriores e armazenam-os em um dos slots RGBA na textura
noise3(ni)
é a implementação real do método 1, enquanto PerlinNoise3D(...)
sugere o último.
Na minha opinião pessoal, o método 1 é muito melhor porque você tem muito mais flexibilidade sobre como usa cada oitava em seus shaders.
Outras dicas
Meu palpite sobre o motivo de usar noise3(ni)
dentro make3DNoiseTexture()
Em vez disso, se PerlinNoise3D(...)
é que quando você usa essa textura de ruído no seu shader, deseja poder replicar e modificar a funcionalidade de PerlinNoise3D(...)
diretamente no shader.
Meu palpite pelo raciocínio por trás ni, inci, incj, inck
é que o uso diretamente x, y, z do volume não dê um bom resultado; portanto, escalando o ruído com a frequência, em vez disso, é possível ajustar a resolução do ruído independentemente do tamanho do volume.