Qual è il ragionamento fondamentale per l'antialiasing che utilizza più campioni casuali all'interno di un pixel?


12

Nella grafica, è comune prendere più campioni entro i limiti di un pixel e combinarli insieme (generalmente facendo semplicemente una media) per un colore finale del pixel del campione. Ciò ha l'effetto di anti-aliasing di un'immagine.

Da un lato, ciò ha senso per me perché ciò che stai effettivamente facendo è integrare il colore del pixel sull'area rappresentata dal pixel. In questa linea di pensiero, la media dei campioni "casuali" sembra essere l'impostazione ideale per l'integrazione con Monte Carlo. ("random" potrebbe essere stratificato, basato sul rumore blu, sequenze a bassa discrepanza ecc.)

D'altra parte, questo sembra sbagliato (o almeno non corretto come potrebbe essere) dal punto di vista dell'elaborazione del segnale digitale. Da quel punto di vista, sembra che stiamo prendendo molti campioni e poi effettuiamo il downsampling usando un filtro box (box blur) per ottenere il valore finale del pixel. Alla luce di ciò, sembra che la cosa ideale da fare sarebbe usare il filtro sincero invece di fare la media dei campioni. Ho potuto vedere che il filtro box è un'approssimazione più economica del pensiero sincero in questo senso.

Questo mi lascia un po 'confuso. L'idea di base che stiamo integrando l'area dei pixel e la media è corretta? Oppure stiamo effettuando il downsampling e dovremmo usare sinc, ma stiamo usando un filtro box perché è veloce?

O è qualcosa di completamente diverso?

Un po 'correlato: antialiasing / filtro in Ray Tracing


Risposte:


9

Dal punto di vista dell'elaborazione del segnale, stai campionando un segnale di dominio continuo e devi filtrarlo per eliminare le frequenze oltre il limite di Nyquist. È quel filtro che porta all'integrazione sull'area dei pixel, o più in generale, all'integrazione sul supporto del kernel antialiasing (che non deve necessariamente essere una casella).

Considera la tua funzione di rendering che prende un punto di esempio nello spazio dello schermo e restituisce il colore trovato in quel punto. (Ignoriamo qualsiasi problema relativo al campionamento casuale per il momento, e supponiamo che restituisca un colore di rendering "perfetto" per quel punto specifico.) Questa funzione definisce efficacemente un segnale di dominio continuo 2D. O, per dirla in altro modo, definisce un'immagine a risoluzione infinita , dal momento che nulla impedisce a questa funzione di avere funzionalità su scale arbitrariamente piccole. In termini di dominio della frequenza: la funzione non è limitata dalla banda; può includere componenti di frequenze spaziali arbitrariamente alte.x,y

Ora vuoi convertirlo in un numero finito di pixel. Proprio come la digitalizzazione di un segnale audio, quando lo campionate, otterrete l'aliasing a meno che non eliminiate prima le frequenze oltre il limite di Nyquist imposto dalla frequenza di campionamento. In altre parole, devi sbarazzarti delle funzionalità più piccole della griglia dei pixel. Per fare ciò, si applica un filtro passa-basso. Il filtro passa-basso ideale è la funzione sinc, ma per vari motivi di praticità usiamo altri filtri (che non eliminano perfettamente le frequenze oltre il limite di Nyquist, ma almeno le attenuano).

Il filtro passa-basso viene eseguito per convoluzione. Se è la funzione di rendering e è un kernel di filtro, allora possiamo definire l'immagine filtrata passa-basso come:f(x,y)k(x,y)

ffiltered(x,y)=f(x,y)k(xx,yy)dxdy

Quindi l'immagine può essere campionata in modo sicuro, quindi i valori dei pixel finali vengono ottenuti semplicemente valutando alle coordinate dei pixel.ffiltered

Se è un filtro box, che assomiglia a all'interno del riquadro pixel e altrove, ciò semplifica l'integrazione di sul riquadro pixel. Ma, come notato, il filtro box non è eccezionale e ci sono scelte migliori come filtri tenda, bicubici e gaussiani.kk=1k=0f

Ad ogni modo, ora che abbiamo un integrale, possiamo usare Monte Carlo per esso e combinarlo con qualsiasi altro integrale che ci piacerebbe fare: per l'illuminazione, il motion blur e così via. Possiamo persino applicare il campionamento di importanza al fattore nell'integrale, generando campioni per ogni pixel che sono distribuiti attorno al centro del pixel secondo .kk


Ottima risposta, come sempre.
Ivokabel,

4

In effetti state facendo entrambe le cose. Stai integrando l'area e poiché il tuo risultato è ancora campioni discreti, stai ricostruendo il segnale per renderlo continuo. Pertanto il filtro di ordine superiore. (Anche l'occhio umano è un campionatore discreto, quindi ricostruisce anche il segnale)

Mi ci è voluto molto tempo per venire a patti con questa spiegazione. La cosa che mi ha aiutato è stato un articolo di Tony Apodaca intitolato The Lore of TDs .


Grazie per l'ottimo link! l'ultimo link su quella pagina sembra tuffarsi proprio in questo. In termini pratici, ti capita di sapere se fare qualcosa al di sopra di una sfocatura della scatola dà davvero molta differenza visiva? O darebbe una spinta alla convergenza?
Alan Wolfe,

2
È il miglior primer per i concetti di rendering della grafica 3D che io abbia mai visto (Duro non è tanto basato su elementi fisici o di tracciamento, ma comunque). Un'immagine filtrata sincera è molto più nitida rispetto al filtro a scatola che dà un aspetto molto sfocato. Convergerebbe più velocemente, ne dubito.
joojaa,

Sembra che quel link non ci sia più. A quale titolo ti riferivi come il miglior primer 3d che hai letto?
johnbakers,
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.