Qual è l'attuale algoritmo all'avanguardia per i campi di altezza di ray-tracing?


16

Nel corso degli anni ci sono state molte carte su diverse tecniche per disegnare un terreno ad altezza di campo in un ray-tracer. Alcuni algoritmi eseguono il ray-march della griglia direttamente (o tramite un quadrifoglio); altri trasformano il terreno in una maglia poligonale e utilizzano un test di intersezione raggio-triangolo standard. La ricerca sembra essere andata avanti negli ultimi anni ed è difficile trovare documenti scritti nell'ultimo decennio, ma l'equilibrio tra memoria e elaborazione (sia CPU che GPU) sta ancora cambiando.

Che tipo di algoritmo offre le migliori prestazioni sui computer desktop di fascia alta al giorno d'oggi? O se non esiste una sola risposta, in cosa differiscono le caratteristiche prestazionali degli algoritmi migliori attuali?


Riflessi dello spazio dello schermo: creare un campo di altezza usando il buffer di profondità e frame, ray trace per ottenere riflessi grezzi. Non conosco i dettagli, ma immagino che Crysis, Killzone, ultimamente Frostbite ecc. Avranno usato una tecnica sofisticata per ottenerlo velocemente. Hai esaminato questo?
David Kuri,

1
@DavidKuri Grazie, questo è un buon suggerimento per come ottenere velocemente il core ray-marking. Dovrebbero esserci molte ottimizzazioni possibili per un campo di altezza più statico che non funziona così bene sulla traccia dello spazio dello schermo, come le mipmap pre-elaborazione o un quad-albero min-max, quindi spero ancora una risposta quello lo copre.
Dan Hulme

Ehi Dan BTW stai cercando soluzioni CPU o GPU? E il rendering in tempo reale o non in tempo reale?
Alan Wolfe,

@AlanWolfe Il mio utilizzo è GPU e non in tempo reale (ovvero velocità massima invece della migliore qualità dell'immagine che è possibile gestire in 16 ms), ma continuerò a valutare risposte interessanti che sono veloci sulla CPU o principalmente per i render interattivi.
Dan Hulme

Potresti provare a creare un campo di distanza firmato dalla mappa di altezza. Questa è fondamentalmente una trama 3d che memorizza la distanza dalla superficie successiva. Ciò consente di "viaggiare il raggio più velocemente". Unreal Engine 4 lo utilizza per l'occlusione ambientale di medio raggio, le ombre morbide e le ombre del terreno in generale
user1888

Risposte:


12

Per lo stato dell'arte attuale, cerca questo documento: "Mipmap massime per il rendering di campi ad altezza dinamica veloci, accurati e scalabili", Tevs et al. 2008

L'idea di base è quella di saltare molto spazio conoscendo il massimo valore su ampie aree del terreno. Se il raggio rimane al di sopra di questo, passa alla prossima area estesa.

Se osservi la Figura 8, vedrai un confronto tra stepping lineare di base e massimo mipmap. Lo stepping lineare si traduce in 200 passaggi, che possono essere eseguiti in tempo reale su gpus moderno ma sono ancora in realtà lenti. Max mipmap fanno lo stesso in circa 10 passaggi, tutti in shader.


Sto accettando questa risposta perché il documento stesso è buono e la sua sezione "Lavori correlati" sembra piuttosto completa. Anche se non finissi per usare esattamente questa tecnica, sono sicuro che sarò in grado di personalizzare qualcosa per il mio caso d'uso da questo e dai suoi riferimenti.
Dan Hulme

Hai trovato delle demo con Maximum mipmaps? Grazie.
raRaRa,

Non ho letto il documento, ma questo "massimo mipmap" suona molto simile alla tecnica utilizzata per il Cone Step Mapping (che migliora la mappatura dell'occlusione della parallasse saltando grandi aree grazie ai coni).
Julien Guertault,

@JulienGuertault Direi che questo è un semplice tracciamento HiZ. è un metodo sicuro per essere sicuro di ciò che colpisci. Ma non molto veloce rispetto ai metodi non sicuri come la ricerca binaria.
v.oddou,

4

Il meglio che ho visto personalmente è quello che fa Inigo Quillez, che viene usato nelle cose del demoscene. Ray marcia il terreno, facendo passi più grandi quanto più si ottiene dalla telecamera poiché (di solito) i dettagli contano meno a distanza (eccezione = pareti sottili!). Usa le informazioni sulla penetrazione e altre metriche facilmente ottenibili per simulare l'occlusione ambientale e altre sofisticate tecniche di illuminazione.

Ecco una demo delle cose in azione: https://www.youtube.com/watch?v=_YWMGuh15nE

Ed ecco la pagina del QI sul terreno raymarching che è una lettura piuttosto interessante: http://www.iquilezles.org/www/articles/terrainmarching/terrainmarching.htm

A proposito, nei giochi moderni, la tecnica della "riflessione dello spazio dello schermo" spesso è solo una marcia di raggio contro il buffer Z della scena renderizzata. Il buffer Z è davvero solo un campo di altezza.

Ho visto alcuni discorsi su questo al siggraph 2014, e mentre alcune persone stavano usando tecniche simili al QI, alcuni stavano facendo cose nemmeno così come il QI, cosa interessante da vedere: P


1
L'algoritmo nel tuo link è molto semplice. Sembra meno sofisticato di alcuni dei documenti che ho trovato negli anni Novanta. Sembra un buon punto di partenza, ma spero in una soluzione ad alte prestazioni per un sistema di produzione, non solo un "mio primo raytracer".
Dan Hulme

Questa roba viene utilizzata nel codice demoscene e nelle riflessioni dello schermo nei giochi moderni più avanzati. Il codice più veloce è talvolta il più semplice. Non lo licenzierei per la sua semplicità. Sarà interessante vedere se hai altre risposte.
Alan Wolfe,

2
Ciò che manca nella tua risposta è che il QI usa una mesh di campo di altezza standard come ipotesi iniziale per avviare raymarching il terreno reale. Per prima cosa esegue il rendering di una versione a basso poli del terreno utilizzando la rasterizzazione standard, quindi esegue un pixel shader sull'immagine che inizia il raymarching alla profondità rasterizzata meno una soglia conservativa. Questo è l'unico modo per realizzarlo in tempo reale.
Benedikt Bitterli

Credo che solo una parte di ciò che stai dicendo sia vera. usa l'euristica basata sull'altezza del terreno (insieme alla distanza dalla telecamera) per capire fino a che punto il raggio può marciare, ma per quanto ho sentito, non usa la rasterizzazione. Ecco un esempio del suo lavoro, che non usa la rasterizzazione, ma ciò non vuol dire che non ci sono implementazioni che usano la rasterizzazione: shadertoy.com/view/MdX3Rr
Alan Wolfe

Sono un po 'confuso sul fatto che la domanda riguardi il ray tracing e questa risposta riguarda il ray marking. C'è una differenza fondamentale tra i due e ciò che possono ottenere.
Julien Guertault,

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.