Qual é o ruído Perlin?
O ruído de Perlin foi inventado em 1983 por Ken Perlin (que recebeu um prêmio da Academia Americana de Artes e Ciências Cinematográficas por essa conquista). Veja bem, naqueles dias, todos estavam se esforçando para o fotorrealismo, mas sempre faltava. Ken Perlin inventou esse algoritmo de ruído para se livrar da aparência miserável de "computador" dos modelos 3D. O ruído é um gerador de números aleatórios em computação gráfica. Esse é um padrão aleatório não estruturado e é útil quando você precisa de uma fonte de peças detalhadas que faltam na estrutura óbvia
1 . O ruído Perlin é um algoritmo multidimensional usado na geração procedural, texturas, geração de elevação, geração de mapa, geração de superfície, geração de vértice, e assim por diante.
A tabela abaixo
2 mostra os limites dos recursos de ruído perlin:
Dimensão | Ruído bruto (escala de cinza) | Aplicação |
1 | | Objetos de vetor olhando desenhados à mão
|
2 | | Objetos como texturas processuais e chamas |
3 | | Ruído Perlin usado no relevo do Minecraft |
Perlin deu a seguinte definição de ruído: o ruído é uma aproximação ao ruído branco, limitada a um intervalo de uma oitava
3 .
A definição
formal de ruído é a seguinte:
Onde
- função de ruído. O ruído de Perlin é um ruído
processual . “O adjetivo
procedural é usado na ciência da computação para separar as entidades descritas pelo código do programa daquelas descritas pelas estruturas de dados.”
4 Ou seja, algo
gerado , e não difícil. O que é bom usar ruído processual em vez de, por exemplo, criar ruído manualmente? O ruído processual
é compacto , ou seja, ocupa menos espaço. É
inextricável , isto é,
aperiódico . É
paramétrico , pode ser acessado
aleatoriamente ; ele também tem muitas outras vantagens que simplificam a vida do artista ... Mas esse não é nosso objetivo final - servir o artista? Ontem, criei um plug-in para o After Effects, que pode ser visto na minha postagem anterior. Eu não levei em conta os interesses do artista nele, apenas os interesses do meu ego, então ninguém o baixou. Eu entendi a lição: sirva o artista, não a si mesmo.
Antes de Perlin, o barulho dos gradientes das grades apareceu. Eles foram gerados por interpolação entre valores aleatórios e, no ruído Perlin, uma
rede cúbica é usada para cada vértice e, em seguida, é realizada a interpolação de
spline . “Um gradiente pseudo-aleatório é obtido através do hash do ponto da rede e usando o resultado para selecionar o gradiente.”
5 Esses hashes se transformam em 12 vetores e são interpolados do centro para as bordas usando um polinômio de quinto grau. É difícil imaginar, certo? Não se preocupe. Vou mostrar isso nas imagens
6 e no pseudo-código
7 .
"... são interpolados do centro para as bordas usando um polinômio de quinto grau"E aqui está o pseudocódigo clássico Perlin sem uma função hash:
Também vale a pena saber que “todas as funções de ruído, exceto o ruído Perlin e o ruído de convolução rarefeito, são aproximadamente do tipo tira. O ruído do Perlin é apenas de banda fraca, o que pode levar a problemas com distorção e perda de detalhes. ”
8 Além disso, o ruído Perlin não possui distribuição de amplitude gaussiana. Ou seja, os pontos de ruído não são espalhados com base em uma função gaussiana, o que não consideraremos neste artigo. Há muitas coisas em que Perlin está muito confortável, mas há coisas em que ele é muito fraco. Na tabela abaixo
9, você pode vê-lo.
Ruído Perlin na prática: implementações GLSL
Então, vamos falar sobre o ruído de Perlin no GLSL. O ruído Perlin pode ser usado como uma onda, como uma cor difusa, como material difuso, como luz trêmula ou como manchas em uma textura. Pessoalmente, eu o usei neste exemplo como uma cintilação de cores.
Enquanto escrevo este artigo, estou pensando em criar um plug-in para o After Effects que adiciona a funcionalidade de ruído Perlin.
O ruído mais simples da Perlin pode ser criado
10 da seguinte maneira:
float rand(vec2 c){ return fract(sin(dot(c.xy ,vec2(12.9898,78.233))) * 43758.5453); } float noise(vec2 p, float freq ){ float unit = screenWidth/freq; vec2 ij = floor(p/unit); vec2 xy = mod(p,unit)/unit;
#define M_PI 3.14159265358979323846 float rand(vec2 co){return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);} float rand (vec2 co, float l) {return rand(vec2(rand(co), l));} float rand (vec2 co, float l, float t) {return rand(vec2(rand(co, l), t));} float perlin(vec2 p, float dim, float time) { vec2 pos = floor(p * dim); vec2 posx = pos + vec2(1.0, 0.0); vec2 posy = pos + vec2(0.0, 1.0); vec2 posxy = pos + vec2(1.0); float c = rand(pos, dim, time); float cx = rand(posx, dim, time); float cy = rand(posy, dim, time); float cxy = rand(posxy, dim, time); vec2 d = fract(p * dim); d = -0.5 * cos(d * M_PI) + 0.5; float ccx = mix(c, cx, dx); float cycxy = mix(cy, cxy, dx); float center = mix(ccx, cycxy, dy); return center * 2.0 - 1.0; }
No entanto, esta é uma versão refeita do ruído de Perlin, criada em 2002. Vá para Gist para ver como o ruído clássico de Perlin é realizado.
Bem, isso é tudo por hoje. Um post curto, eu sei, e falta conteúdo original, mas até agora fiquei sem ideias, porque ainda não li
a renderização em tempo real . Este livro está cheio de conceitos e idéias para aprender e aprender. Eu a amo!
Paralelamente, estou lendo outro livro -
Fundamentos de computação gráfica . Estou um pouco preso ao tópico das curvas implícitas, mas vou pedir ao meu parente com um PhD em matemática para me ajudar.
Referências
- Uma Pesquisa de Funções de Ruído Processual, Fórum de Computação Gráfica, Volume 29 (2010), Número 8, pp 2379-2600
- Ruído computacional eficiente, Journal of Graphics Tools Volume 16, Nº 2: 85-94
- A Survey, et al.
- flafla2.imtqy.com/2014/08/09/perlinnoise.html
- A. Lagaue e cols.
- A. Lagae e outros
- A. Lagae e outros
- From flafla2.imtqy.com/2014/08/09/perlinnoise.html
- Da Wikipedia
- A. Lagae e outros
- Adaptado de A. Lagae, et al.
- gist.github.com/patriciogonzalezvivo/670c22f3966e662d2f83