Deslocamento de vértices
Mover os vértices de uma malha com ondas ou ruído, e recalcular as normais para a luz acompanhar.
Cards
Um exemplo ao vivo para ajustar, aprender e copiar.
Como funciona
As outras técnicas de Distorcer imitam movimento lendo uma imagem em outro lugar. O deslocamento de vértices move a
superfície de verdade. Ele roda no shader de vérticeO programa da GPU que roda uma vez para cada vértice de uma malha. Ele posiciona o vértice na tela escrevendo gl_Position e repassa valores para o shader de fragmento. Shader de vértice O programa da GPU que roda uma vez para cada vértice de uma malha. Ele posiciona o vértice na tela escrevendo gl_Position e repassa valores para o shader de fragmento.
vec3 moved = position + normal * height(position.xz, time);
A silhueta muda, a superfície esconde o que está atrás dela, e o depth buffer vê a forma real. Nenhum warping de UV consegue isso.
Três coisas que decidem se funciona
A malha precisa de vértices para mover. O shader só move os pontos que existem. Um quad tem quatro; uma onda atravessando ele precisa de muitos por comprimento de onda, ou as cristas aparecem como segmentos retos. Deslocamento anda junto com um plano subdividido, uma esfera densa, ou tesselação onde a plataforma tiver.
Recalcule a normal. O vértice fica com a normalUm vetor unitário perpendicular a uma superfície, apontando para onde ela está virada. Iluminação e efeitos Fresnel o comparam com outras direções. Normal Um vetor unitário perpendicular a uma superfície, apontando para onde ela está virada. Iluminação e efeitos Fresnel o comparam com outras direções.
- Analiticamente, pelas derivadas do deslocamento. As duas tangentes da superfície são as derivadas da posição movida ao longo de x e de z, e o produto vetorial delas é a normal. Exato e barato quando a função é conhecida, como em senos e ondas de Gerstner.
- Por diferenças finitas: calcule a altura um passo pequeno ao lado, em x e em z, e monte as tangentes com as diferenças. Funciona para qualquer função, ruído incluso, e custa duas avaliações a mais.
Faça a mesma conta em todo lugar onde a superfície é usada. A passada de sombra, o depth prepass e a física que faz um barco boiar precisam da superfície movida. Numa engine, a função de vértice roda em cada passada sozinha; um teste de flutuação feito na CPU precisa repetir a mesma conta no código do jogo.
Em qual espaço
O deslocamento costuma ser calculado em espaço de mundo, para as ondas se alinharem entre malhas vizinhas e não
girarem junto com o objeto. A matrizUma grade de números (mat2, mat3, mat4) que leva um vetor a outro numa única multiplicação. Rotação, escala e, com coordenadas homogêneas, translação e projeção são todas matrizes. Matriz Uma grade de números (mat2, mat3, mat4) que leva um vetor a outro numa única multiplicação. Rotação, escala e, com coordenadas homogêneas, translação e projeção são todas matrizes.rotate(a) = [cos a −sin a; sin a cos a]
Leitura complementar
- 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
- Coordinate Systems (abre em uma nova aba)Artigo
- WebGL model view projection (abre em uma nova aba)Documentação
- Homogeneous coordinates (abre em uma nova aba)Referência
- Normal (geometry) (abre em uma nova aba)Referência
- Basic Lighting (abre em uma nova aba)Artigo
- Normal Mapping (abre em uma nova aba)Artigo
- 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
- The OpenGL ES Shading Language, version 3.00 (abre em uma nova aba)Documentação
- Spatial shaders (abre em uma nova aba)Documentação
- Effective Water Simulation from Physical Models (GPU Gems, chapter 1) (abre em uma nova aba)Livro
- Trochoidal wave (abre em uma nova aba)Referência
- Dispersion (water waves) (abre em uma nova aba)Referência
- cross (abre em uma nova aba)Referência
- normalize (abre em uma nova aba)Referência
- Your first 3D shader (abre em uma nova aba)Documentação