1. Ruído aleatório vs ruído coerente

O que muda quando vizinhos passam a se parecer.

Em 2D: chuvisco vs nuvem

Os dois mapas abaixo usam a mesma semente e a mesma quantidade de "informação aleatória". A diferença é só uma: à direita, cada ponto é parecido com o vizinho.

Ruído branco: hash(x, y) por pixel
Ruído coerente (Perlin): perlin(x·escala, y·escala)

Ruído branco não tem "escala": qualquer zoom mostra chuvisco. No coerente, a escala escolhe o tamanho das manchas.

Em 1D: uma linha por vez

Em 1D fica mais fácil ver como o coerente é construído. A entrada é um número x; a saída é um número. Os pontos pretos são os nós: coordenadas inteiras onde o valor aleatório mora. Entre eles, a curva é calculada, não sorteada.

As três propriedades do ruído coerente (definição do libnoise):
  1. Mesma entrada, mesma saída. A função é determinística. Arraste o slider de semente e volte: a curva volta igual.
  2. Pequena mudança na entrada, pequena mudança na saída. Mova o ponto laranja: o valor muda suavemente. No ruído branco ele pula.
  3. Mudança grande na entrada, saída aparentemente sem relação. Dois nós distantes não têm nada a ver um com o outro.

O que "coerente" quer dizer na prática

Se você usar Random.Range para a altura de cada ponto do terreno, obtém o mapa da esquerda: impossível de andar, sem colinas, sem vales. Com ruído coerente, cada valor depende dos vizinhos e o terreno nasce contínuo. O resto da aula é sobre como controlar o resultado (demos 2 a 6). Como o ruído é construído por dentro fica na demo 7, opcional.