Pular para o conteúdo
Forma · TécnicaAvançado

Formas 3D com raymarching

Desenhar cenas 3D inteiras a partir de funções de distância dentro de um único shader de fragmento, sem nenhuma malha.

UVTempoTela cheia

Cards

Um exemplo ao vivo para ajustar, aprender e copiar.

Como funciona

A maior parte dos gráficos 3D começa por triângulos. O raymarching começa por uma função. A cena é um campo de distância com sinal em 3D: entregue a ela qualquer ponto e ela devolve a que distância ele está da superfície mais próxima. Uma esfera é length(p) - r; uma caixa, um toro ou uma cápsula pedem uma ou duas linhas cada; e os operadores da composição 2D funcionam sem mudança, então min junta formas e um mínimo suave as derrete uma na outra.

Para ver a cena, um shader de fragmento sobre um quad de tela cheia dispara um raio por pixel a partir de uma câmera virtual. Ele avança pelo raio na distância da cena, que é sempre um passo seguro porque nada está mais perto, até a distância ficar quase zero: o raio acertou. A normal da superfície vem do gradiente do campo, algumas amostras a mais em volta do ponto atingido, e a partir daí a iluminação é o mesmo produto escalar de qualquer malha.

O que você ganha é um tipo de geometria que triângulos não dão com facilidade: formas que se fundem suavemente, que se repetem ao infinito com um mod no ponto, que dobram e torcem, todas exatas em qualquer zoom e mudando a cada quadro sem malha nenhuma para reconstruir. O preço é um laço em cada pixel, e cada passo avalia a cena inteira. Isso faz dele a ferramenta para demos de tela cheia, fundos, telas de título e efeitos dentro de uma caixa, e a ferramenta errada para a geometria principal de um jogo.

Numa engine, ele roda num retângulo de tela cheia (o ColorRect do Godot, um quad na frente da câmera nas outras). Misturá-lo com as malhas da própria engine exige escrever a profundidade do ponto atingido, e cada engine trata isso de um jeito.

Leitura complementar