Provavelmente é mais fácil de entender, em contraste com o raytracing.
Para renderizar um primitivo com rastreamento de raio, você precisa de uma função que, dado o raio primitivo e de entrada, informe exatamente onde esse raio atinge o primitivo. Em seguida, você pode testar o raio em relação a todas as primitivas relevantes e escolher a interseção mais próxima. CPUs são boas nisso.
Com o raymarching, você não possui uma função simples de interseção de raios. Dado um ponto no raio, você pode estimar o quão próximo o ponto está da superfície, mas não sabe exatamente até que ponto você precisa estender esse raio para atingir a superfície.
Então, você "marcha" um passo de cada vez:
Comece no "início" do raio - o plano próximo para a renderização da cena, ou a interseção com o volume limite, se for apenas um objeto na cena. (P0 no diagrama abaixo)
Avalie sua função de distância para obter uma estimativa de quão perto você está da superfície. (O maior círculo do diagrama)
Avance ao longo do raio de acordo com sua estimativa. O movimento deve ser conservadoramente curto, para que você tenha certeza de que não vai atravessar a superfície em nenhum lugar.
Agora você tem um novo ponto (P1 abaixo) - obtenha uma nova estimativa e repita.
Continue obtendo estimativas e avançando até chegar a uma distância limite da superfície ou atingindo sua contagem máxima de passos. (P4 abaixo)
Agora você tem a profundidade da superfície e pode inferir coisas como normais / oclusão ambiental de amostras próximas e usar esses dados para iluminar e colorir o pixel.
Exemplo de diagrama da GPU Gems 2, capítulo 8
Como cada raio é independente e utiliza (geralmente) apenas informações locais em cada etapa, está pronto para paralelizar as GPUs. Frequentemente, apenas dois triângulos serão desenhados na tela. Depois de rasterizar isso, cada pixel passado para o shader de fragmento representa um único raio. O sombreador de fragmento marcha esse raio até atingir a superfície, retornando o resultado (geralmente apenas o valor de profundidade para texturizar e sombreado em uma passagem de tela cheia separada).
As etapas exatas dependem muito do efeito específico que você está tentando alcançar. Técnicas de Raymarching são usadas com ...
- campos de altura para simular o deslocamento da superfície na geometria rasterizada tradicional (mapeamento de oclusão de paralaxe)
- buffers de profundidade de cena para coisas como reflexões no espaço da tela
- texturas de volume para visualizar conjuntos de dados com amostra em 3D (geralmente científicos / médicos)
- funções implícitas para renderizar coisas como fractais
- distância processual como no trabalho de Iñigo Quilez (ótimos links da msell nos comentários acima).
O Raymarching também é usado com a mistura em cada etapa (geralmente usando etapas fixas em vez de estimar uma distância a cada vez) para renderizar translucidez volumétrica, como neste exemplo da Wikipedia .
Isso se tornou uma maneira popular de renderizar nuvens detalhadas em tempo real .
Mesmo o Mapeamento de interiores , uma maneira de simular os detalhes da sala interior atrás das janelas da construção, pode ser considerado uma forma de marcação de raio, onde o raio é pisado a partir do ponto em que entra na janela até a parede, piso / teto ou plano de móveis mais próximo.
Se você estiver interessado em um tipo específico de efeito raymarching, provavelmente poderá obter respostas mais detalhadas fazendo uma nova pergunta com exemplos específicos. Como família, a técnica é muito diversa para cobrir tudo em uma resposta curta. ;) Espero que isso ofereça uma estrutura para entender o que está acontecendo nos bastidores desses shaders.