Por que é duas vezes mais caro fazer uma função de ruído que pode ser ladrilhada?

12

Eu já vi em vários lugares que fazer o ruído do Perlin funcionar perfeitamente exige que seja calculado duas vezes de maneiras ligeiramente diferentes e somando os dois resultados.

Este FAQ sobre matemática de ruído da Perlin fornece uma fórmula:

Feuoop(x,y,z)=(t-z)F(x,y,z)+zF(x,y,z-t)t

para fazer uma função de ruído fazer um loop na direção z . É também menciona que a extensão desta, para efectuar um ciclo em 2 dimensões levaria 4 avaliações de F e de laço em 3 dimensões levaria 8 avaliações da F .FzFF

Entendo que isso fornece uma junção perfeita entre blocos que não é apenas contínua, mas continuamente diferenciável, mas, intuitivamente, espero que seja esse o caso se a função de ruído for simplesmente avaliada uma vez com pontos de grade reduzidos no módulo do tamanho de bloco necessário. Se a função de ruído for baseada apenas nos pontos de grade adjacentes imediatamente (4 para ruído 2D, 8 para ruído 3D), certamente usando os pontos de grade mais à esquerda quando o ponto a ser calculado ultrapassar a borda direita do ladrilho mesma qualidade de ruído entre outros pontos da grade?

Desde que eu vi essa abordagem de cálculo múltiplo em vários lugares, presumo que ela deva ter alguma vantagem, mas estou lutando para ver a desvantagem de simplesmente agrupar os pontos da grade de volta ao início quando eles ficarem grandes demais. o que estou perdendo?

Trichoplax
fonte

Respostas:

18

É lamentável que as pessoas geralmente recomendem isso. Misturar entre duas (ou quatro, etc.) cópias traduzidas de uma função de ruído dessa maneira é uma péssima idéia. Não é apenas caro, nem produz resultados de aparência correta!

Ruído Perlin Ruído combinado Perlin

À esquerda, há algum ruído Perlin. À direita, há duas instâncias de ruído Perlin, empilhadas e combinadas da esquerda para a direita.

A diferença é meio sutil, mas você pode ver que a segunda imagem tem um contraste mais baixo em uma coluna vertical correndo no meio. É aí que há uma mistura de 50% entre duas instâncias diferentes da função de ruído. Essa mistura não se parece com a função de ruído original: apenas se parece com uma bagunça enlameada.

OK, por isso não é bastante que mal só de olhar para o ruído cru ... mas se você, em seguida, fazer quaisquer transformações não lineares na imagem, o contraste não uniforme pode causar problemas. Por exemplo, aqui estão as imagens com um limite de 60%. (Pense em gerar ilhas no oceano, por exemplo.)

Ruído Perlin com limiar Ruído Perlin combinado com limiar

Agora você pode ver claramente como a imagem à direita tem menos áreas brancas menores no meio.

Como você mencionou, para ruídos baseados em grade como Perlin, a melhor maneira é colocar os gradientes pseudo-aleatórios nos pontos da grade. Isso é fácil e barato de fazer, e então você pode aplicar o algoritmo de interpolação aos gradientes como de costume (como a interpolação bilinear de uma textura de ladrilhos). Isso produz ruído de lado a lado sem artefatos estranhos, porque funciona com o algoritmo de ruído subjacente, e não por cima dele. Você pode usar uma estratégia semelhante com o ruído Worley (ruído celular) agrupando os pontos de recurso aleatórios que ele usa como base.

Com várias oitavas de ruído, nem sempre é tão fácil. Se a escala relativa entre as oitavas (também conhecida como "lacunaridade") não for um número racional inteiro ou simples, talvez você não consiga encontrar um ponto de mosaico conveniente, onde todas as grades das oitavas coincidem. Você poderia organizar cada oitava independentemente, mas o ruído geral ainda não seria inclinável nesse caso.

Nathan Reed
fonte
4
Imagens lado a lado realmente fazem a diferença para obter uma sensação intuitiva da explicação. Vou ter isso em mente para minhas próprias respostas.
Trichoplax