Pular para o conteúdo
Distorcer · TécnicaIntermediário

Deslocamento de vértices

Mover os vértices de uma malha com ondas ou ruído, e recalcular as normais para a luz acompanhar.

PosiçãoNormalVisãoTempoVértice

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értice, uma vez por vértice, antes de o vértice ser projetado: pegue a posição do vértice, some um deslocamento e passe a posição movida adiante.

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 normal da malha plana se você não a mudar. A iluminação lê essa normal, então uma superfície deslocada iluminada com a antiga parece plana: a forma se move, o sombreamento não. Dois jeitos de obter a nova:

  • 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 matriz de modelo leva a posição de repouso para o espaço de mundo primeiro, o deslocamento é somado ali, e depois as matrizes de visão e projeção rodam como sempre.

Leitura complementar