Como funcionam os shaders Raymarch?

49

Eu estive olhando shaders encontrados aqui shadertoy.com e a maioria dos legais tem barulho e raymarch em comum. Eu não entendo o código fonte, mas realmente quero. Como esses shaders funcionam e como o algoritmo raymarch funciona? Eu procurei por todo o lado e não consigo encontrar nada sobre o assunto.

obrigado

jmasterx
fonte
6
Iñigo Quilez escreveu excelentes tutoriais sobre isso. Consulte iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm , iquilezles.org/www/material/nvscene2008/nvscene2008.htm e iquilezles.org/www/articles/distfunctions/distfunctions.htm . Esses shaders legais não são apenas marcadores de raios, mas especificamente campos de distância de raios, também chamados de rastreamento de esferas.
msell
Você está perguntando sobre marchar com raios em geral ou marchar com raios na GPU?
usar o seguinte
@Milo Você poderia esclarecer sua pergunta? Você está perguntando como esses algoritmos são usados ​​para gerar as imagens que você vê nas demos legais? Você está perguntando como a marcha dos raios funciona? Você está perguntando como a marcha de raios em shaders de fragmento / pixel (implementação eficiente) funciona?
TravisG
Eu implementei Raymarching na Unidade motor github.com/smkplus/UnityRayMarching
Seyed Morteza Kamali

Respostas:

78

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:

  1. 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)

  2. 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)

  3. 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.

  4. Agora você tem um novo ponto (P1 abaixo) - obtenha uma nova estimativa e repita.

  5. 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)

  6. 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.

Marchando um raio de P0 em direção a sua interseção

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 .

Raymarching uma textura translúcida de volume

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.

DMGregory
fonte