Come vengono gestiti gli effetti volumetrici nel raytracing?


10

In che modo gli effetti volumetrici come fumo, nebbia o nuvole sono resi da un raytracer? A differenza degli oggetti solidi, questi non hanno una superficie ben definita con cui calcolare un'intersezione.

Risposte:


11

Panoramica

La comparsa di volumi (chiamati anche media partecipanti) in natura è causata da minuscole particelle, come polvere, gocce d'acqua o plancton, che sono sospese nel fluido circostante, come aria o acqua. Queste particelle sono oggetti solidi e la luce si rifrange o si riflette su questi oggetti come su una superficie normale. In teoria, i media partecipanti potrebbero quindi essere gestiti da un tradizionale ray tracciante con solo intersezioni di superfici.

Modello statistico

Naturalmente, il semplice numero di queste particelle rende impossibile tracciarle individualmente. Invece, sono approssimati con un modello statistico: poiché le particelle sono molto piccole e la distanza tra le particelle è molto più grande della dimensione delle particelle, le interazioni individuali di luce con le particelle possono essere modellate come statisticamente indipendenti. Pertanto, è una ragionevole approssimazione sostituire le singole particelle con quantità continue che descrivono l'interazione "media" luce-particella in quella determinata regione nello spazio.

Per il trasporto volumetrico di luce basato fisicamente, sostituiamo inconcepibilmente molte particelle con un mezzo partecipante continuo che ha due proprietà: il coefficiente di assorbimento e il coefficiente di dispersione. Questi coefficienti sono molto convenienti per il ray tracing, in quanto ci consentono di calcolare la probabilità che un raggio interagisca con il mezzo, ovvero la probabilità di colpire una delle particelle, in funzione della distanza.

σatetσaσsetσs; cioè, più a lungo viaggiamo attraverso un mezzo, più è probabile che colpiamo una particella e siamo sparsi in una direzione diversa.

σt=σa+σstetσtt1etσt

Rendering con i media partecipanti

1etσtttσaσtσsσt

Il modo in cui il raggio è sparso è descritto dalla funzione di fase e dipende dalla natura delle particelle; la funzione di fase di Rayleigh descrive lo scattering da particelle sferiche più piccole della lunghezza d'onda della luce (ad es. la nostra atmosfera); la funzione fase Mie descrive la dispersione da particelle sferiche di dimensioni simili alla lunghezza d'onda (ad es. gocce d'acqua); nella grafica, di solito viene utilizzata la funzione di fase Henyey-Greenstein , originariamente applicata allo scattering dalla polvere interstellare.

tMaxtt<tMaxttMax, il raggio ha superato illeso e interagisce con la superficie come al solito.

prospettiva

Questo post era solo una piccola introduzione al rendering con i media partecipanti; tra l'altro, ho completamente ignorato i coefficienti spazialmente variabili (di cui hai bisogno per nuvole, fumo, ecc.). Le note di Steve Marschner sono una buona risorsa, se sei interessato. In generale, i media partecipanti sono molto difficili da rendere in modo efficiente e puoi andare molto più sofisticato di quello che ho descritto qui; c'è mappatura fotonica volumetrica , fasci di fotoni , approssimazioni di diffusione , campionamento di importanza congiunta e altro ancora. C'è anche un lavoro interessante su supporti granulari che descrive cosa fare quando il modello statistico si rompe, cioè le interazioni tra particelle non sono più statisticamente indipendenti.


4

Un modo per farlo - che non è esattamente la soluzione "vai a", ma può funzionare bene, è trovare la distanza percorsa dal raggio attraverso il volume e utilizzare l'integrazione di alcune funzioni di densità per calcolare quanta "roba" era colpire.

Ecco un link con un'implementazione di esempio: http://blog.demofox.org/2014/06/22/analytic-fog-density/


3

Dipende dall'effetto volume.

Gli effetti di volume uniforme che non appartengono alla dispersione possono essere simulati semplicemente calcolando le distanze di entrata e uscita dei raggi.

Altrimenti è necessario eseguire l'integrazione del percorso del raggio, noto anche come marcia del raggio. Per evitare la necessità di sparare ai raggi secondari, il raymarching è spesso associato a una sorta di cache, come la mappa di profondità, le mappe di profondità, le mappe di mattoni o le nuvole di voxel per l'ombra della luce, ecc. In questo modo non è necessario marciare necessariamente l'intera scena. La memorizzazione nella cache simile viene spesso eseguita sulla trama procedurale del volume.

È anche possibile convertire la trama in primitivi di superficie come scatole, sfere o piani che presentano una trama con bordi morbidi adatti. È quindi possibile utilizzare le normali tecniche di rendering per risolvere l'effetto volumetrico. Il problema è che di solito hai bisogno di molti primitivi. Inoltre, la forma della primitiva può apparire come un campionamento troppo uniforme.


Voglio solo notare che puoi fare un'effettiva integrazione di un percorso di raggio anche analiticamente, non devi usare il raggio di marcia se è indesiderabile.
Alan Wolfe,

@AlanWolfe è quello che fai nel caso uniforme, tuttavia se il mezzo partecipa con la geometria, allora devi fare qualcosa di più elegante. Comunque non ho sostenuto che questo è tutti i metodi.
joojaa,

Di sicuro, sto solo aggiungendo alla tua risposta. Quando dici caso uniforme non sei sicuro di cosa significhi esattamente ma per il caso della nebbia, non deve essere una densità uniforme, ma solo una funzione di densità che puoi integrare. È quello che intendevi per caso uniforme?
Alan Wolfe,
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.