Come funzionano gli shader Raymarch?


49

Ho visto shader trovati qui shadertoy.com e la maggior parte di quelli fantastici hanno rumore e raymarch in comune. Non capisco affatto il codice sorgente ma lo voglio davvero. Come funzionano questi shader e come funziona l'algoritmo raymarch? Ho cercato dappertutto e non riesco a trovare nulla sull'argomento.

Grazie


6
Iñigo Quilez ha scritto eccellenti tutorial su questo. Vedi iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm , iquilezles.org/www/material/nvscene2008/nvscene2008.htm e iquilezles.org/www/articles/distfunctions/distfunctions.htm . Questi fantastici shader non sono solo un raymarching, ma in particolare campi di distanza raymarching, chiamati anche traccia della sfera.
msell

Stai chiedendo di ray marching in generale o ray marching su GPU?
concept3d

@Milo Potresti chiarire la tua domanda? Stai chiedendo come vengono utilizzati questi algoritmi per generare le immagini che vedi nelle fantastiche demo? Stai chiedendo come funziona la marcia dei raggi? Stai chiedendo come funziona il ray-marking in shader di frammenti / pixel (ovvero implementazione efficiente)?
TravisG,

Ho implementato Raymarching in Unity Engine github.com/smkplus/UnityRayMarching
Seyed Morteza Kamali

Risposte:


78

Probabilmente è più facile da capire in contrasto con raytracing.

Per rendere una primitiva con raytracing, hai bisogno di una funzione che, dato il raggio primitivo e di input, ti dice esattamente dove quel raggio colpisce la primitiva. Quindi puoi testare il raggio su tutte le primitive rilevanti e scegliere l'intersezione più vicina. Le CPU sono brave in questo.

Con raymarching, non hai una funzione di intersezione raggio così semplice. Dato un punto sul raggio, puoi stimare quanto è vicino il punto alla superficie, ma non sai esattamente fino a che punto devi estendere quel raggio per colpire la superficie.

Quindi, "marcia" un passo alla volta:

  1. Inizia dall '"inizio" del raggio: il piano vicino per il rendering della scena o l'intersezione con il volume limite se è solo un oggetto nella scena. (P0 nello schema seguente)

  2. Valuta la tua funzione di distanza per ottenere una stima di quanto sei vicino alla superficie. (Il cerchio più grande nel diagramma)

  3. Spostati in avanti lungo il raggio secondo la tua stima. La mossa dovrebbe essere prudentemente breve, quindi sei sicuro che non attraverserai la superficie da nessuna parte.

  4. Ora hai un nuovo punto (P1 sotto): ottieni un nuovo preventivo e ripeti.

  5. Continua a ottenere stime e ad avanzare finché non raggiungi una distanza di soglia dalla superficie o non raggiungi il numero massimo di passi. (P4 sotto)

  6. Ora hai la profondità della superficie e puoi dedurre cose come l'occlusione normale / ambientale dai campioni vicini e usare questi dati per illuminare e colorare il pixel.

Marcia di un raggio da P0 verso la sua intersezione

Diagramma di esempio da GPU Gems 2, capitolo 8

Poiché ogni raggio è indipendente e utilizza (generalmente) solo informazioni locali in ogni fase, è maturo per il parallelismo sulle GPU. Spesso, sullo schermo verranno disegnati solo due triangoli. Dopo averli rasterizzati, ogni pixel passato allo shader di frammento rappresenta un singolo raggio. Lo shader di frammenti marcia quel raggio fino a raggiungere la superficie, restituendo il risultato (spesso solo il valore di profondità per la trama e l'ombreggiatura in un passaggio a schermo intero separato).

I passaggi esatti dipendono molto dall'effetto particolare che stai cercando di ottenere. Le tecniche di Raymarching sono utilizzate con ...

  • campi di altezza per simulare lo spostamento della superficie sulla geometria rasterizzata tradizionale (mappatura di occlusione della parallasse)
  • buffer di profondità della scena per cose come i riflessi dello spazio dello schermo
  • trame di volume per la visualizzazione di set di dati campionati in 3D (spesso scientifici / medici)
  • funzioni implicite per il rendering di cose come i frattali
  • campi procedurali a distanza come nel lavoro di Iñigo Quilez (ottimi collegamenti da msell nei commenti sopra).

Il raymarching viene anche utilizzato con la fusione ad ogni passo (spesso usando passi fissi invece di stimare una distanza ogni volta) per il rendering della traslucenza volumetrica, come in questo esempio tratto da Wikipedia .

Raymarching una trama volumetrica traslucida

Questo è diventato un modo popolare per eseguire il rendering di nuvole dettagliate in tempo reale .

Anche la mappatura degli interni , un modo per simulare i dettagli della stanza interna dietro le finestre dell'edificio, potrebbe essere considerata una forma di raymarching, in cui il raggio viene fatto avanzare dal punto in cui entra nella finestra verso il muro, il pavimento / soffitto o il piano di mobili più vicini.

Se c'è un tipo specifico di effetto raymarching che ti interessa, probabilmente puoi ottenere risposte più dettagliate ponendo una nuova domanda con esempi specifici. Come famiglia, la tecnica è troppo diversificata per coprire tutto in una breve risposta. ;) Spero che questo ti dia un quadro per capire cosa succede sotto il cofano in questi shader.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.