UV warping
Entortar uma imagem mudando a coordenada onde ela é lida, com ondas ou ruído.
Cards
2 exemplos ao vivo para ajustar, aprender e copiar.
Como funciona
Um shader nunca move pixels. Ele decide, para cada pixel, onde olhar: qual ponto de um padrão desenhar, ou qual ponto
de uma textura ler. O UV warping muda esse “onde”. Some um pequeno deslocamento à UVUma posição 2D numa superfície ou na tela, em geral de 0 a 1 nos dois eixos. Shaders desenham formas e padrões como funções dela. Coordenadas UV Uma posição 2D numa superfície ou na tela, em geral de 0 a 1 nos dois eixos. Shaders desenham formas e padrões como funções dela.uv = gl_FragCoord.xy / resolution
vec2 warped = uv + offset(uv, time);
vec3 color = pattern(warped); // ou texture(image, warped).rgb
O fundamento de transformações 2D move o espaço inteiro por um único deslocamento. O warping é a mesma conta, com um deslocamento que varia pela superfície. Tudo no visual mora no deslocamento:
- Uma onda senoidal ao longo de um eixo dá uma ondulação que viaja: uma bandeira, um estandarte, linhas de água.
- Vários senos em frequências sem relação dão um tremor que não se repete de forma visível: calor, miragem, vidro.
- Ruído dá curvas orgânicas e imprevisíveis, e alimentar o ruído com ele mesmo é a distorção de domínio: fumaça, tinta, mármore.
Dois estágios, uma ideia
Numa superfície, a coordenada entortada alimenta um padrão procedural ou a própria textura do objeto. A Bandeira tremulando desenha as listras na UV entortada, então o tecido parece dobrar, embora o quad continue plano.
Como passada de pós-processamento de tela, a coordenada entortada lê o quadro pronto. A cena é desenhada primeiro
num render targetUma textura em que um desenho escreve no lugar da tela, para uma passada seguinte ler o resultado. Blur, bloom e todo efeito com várias passadas usam isso. Render target Uma textura em que um desenho escreve no lugar da tela, para uma passada seguinte ler o resultado. Blur, bloom e todo efeito com várias passadas usam isso. Cadeia de pós-processamento Passadas de tela cheia rodadas em ordem sobre o quadro pronto, cada uma lendo a imagem que a anterior escreveu. Bloom, tone mapping e correção de cor ficam aqui.
Num sprite, a mesma leitura pega a textura do sprite, para uma planta balançando ou uma bandeira num jogo 2D.
O que observar
- A intensidade está em unidades de UV. Um deslocamento de 0.01 move a leitura em 1% da superfície, o que numa tela de 1000 pixels dá 10 pixels. Uma distorção de tela já parece forte bem antes disso.
- Bordas. Uma leitura entortada perto da borda cai fora de 0..1. Uma textura com clamp repete o texel da borda, e uma com repeat dá a volta até o outro lado; escolha a que disfarça melhor, ou reduza o warping perto das bordas.
- Onde o deslocamento é zero, nada se move. Mascarar o deslocamento (por altura, distância ou uma textura) é como você mantém parado o mastro de uma bandeira ou limita o calor ao ar acima de uma fogueira.
Leitura complementar
- Domain warping (abre em uma nova aba)Artigo
- Fractal Brownian Motion (abre em uma nova aba)Livro
- Improving Noise (abre em uma nova aba)Paper
- Perlin noise (abre em uma nova aba)Referência
- Simplex noise (abre em uma nova aba)Referência
- sin (abre em uma nova aba)Referência
- Sine wave (abre em uma nova aba)Referência
- Shaping functions (abre em uma nova aba)Livro
- 2D Matrices (abre em uma nova aba)Livro
- Rotation matrix (abre em uma nova aba)Referência
- Transformations (abre em uma nova aba)Artigo
- Framebuffers (abre em uma nova aba)Artigo
- Bloom (abre em uma nova aba)Artigo
- Custom post-processing (abre em uma nova aba)Documentação
- cos (abre em uma nova aba)Referência
- CanvasItem shaders (abre em uma nova aba)Documentação
- Using VisualShaders (abre em uma nova aba)Documentação
- Mirage: heat haze (abre em uma nova aba)Referência
- Screen-reading shaders (abre em uma nova aba)Documentação
- Generic Refraction Simulation (GPU Gems 2, chapter 19) (abre em uma nova aba)Livro
- texture (abre em uma nova aba)Referência