Perché usare un filtro tenda nella traccia del percorso?


12

Le 99 linee del tracciatore di percorso C Smallpt eseguono il rendering di una griglia subpixel 2x2 per ogni pixel che intende eseguire il rendering e quindi un filtro tenda per combinarli.

C'è una presentazione interessante che spiega il codice qui e menziona il filtro tenda ma non spiega perché è lì.

Qualcuno può spiegare perché un filtro a tenda sarebbe preferibile in questo caso a una sfocatura della scatola (solo facendo la media dei campioni)?

Sarebbe di qualità superiore andare con qualcosa di meglio di un filtro a tenda, come l'interpolazione bicubica dell'eremita?

Risposte:


13

Il filtro antialiasing ideale teorico per i dati campionati discretamente è un filtro sinc , perché rimuove perfettamente tutte le frequenze più alte della frequenza di Nyquist, lasciando da parte tutte quelle più basse. Quindi, in una certa misura, possiamo aspettarci che i filtri antialias assomiglino maggiormente al filtro sinc per produrre immagini di qualità migliore.

Il filtro tenda (filtro triangolare) assomiglia sicuramente al picco centrale del filtro sinc più da vicino rispetto al filtro box:

filtri sinc, triangolo e box

Un filtro bicubico (ad esempio Mitchell-Netravali) potrebbe catturare la forma del sinc in modo ancora più preciso, compresi i suoi primi due lobi negativi.

La realtà della selezione di filtri è un po 'più sottile di "sinc approssimativo il più possibile", poiché esistono diversi tipi di artefatti che possono essere generati da filtri antialiasing "non ideali", come aliasing, overblurring e ringing. Inoltre, filtri diversi possono essere più o meno costosi dal punto di vista computazionale. Quindi si tratta di cercare di scambiare i diversi artefatti l'uno contro l'altro e contro la performance. Scene / immagini diverse possono favorire una scelta o l'altra, ed è anche parzialmente un giudizio estetico.

Per quanto riguarda il motivo per cui smallpt utilizza in particolare un filtro tenda, immagino per una combinazione di prestazioni (è un filtro rapido da valutare) e brevità: può essere fatto in un paio di righe di codice, mentre un filtro bicubico richiederebbe un mucchio di più codice.

Per inciso, smallpt utilizza effettivamente una griglia subpixel 2x2 e posiziona un filtro tenda su ciascun subpixel , quindi calcola in media i risultati dei quattro subpixel. Quindi l'effetto complessivo è, curiosamente, quello della somma di quattro tende, che finisce per sembrare una piramide con una cima piatta:

filtri tenda subpixel

Non sono sicuro che fosse intenzionale o che fosse semplicemente il modo in cui ha funzionato. La mia ipotesi è che ciò si traduca in un'immagine leggermente più nitida rispetto all'utilizzo di un singolo filtro tenda per pixel (a causa del supporto più stretto), ma probabilmente anche aliasing più visibile.


Non posso fare a meno di dire grazie! In realtà, per prima cosa capisco come un campionamento stratificato con 4 strati. E rendo personalizzabile il numero di "strati", come 9, 16 ... Ora, so che è un filtro "trapezoidale" (non così comune in altri renderer). E poiché il numero dei miei "strati" tende ad essere infinito, il filtro diventa un filtro a scatola, dove sto dipingendo il giglio ... Interessante!
Chaosink,

3

Ho appena guardato gli articoli di Wikipedia sull'interpolazione bilineare. Un filtro a tenda è una specie di interpolazione bilineare. Un'interpolazione bilineare si interpola su 2 dimensioni. Prima interpola linearmente su una dimensione e poi sull'altra.

inserisci qui la descrizione dell'immagine

Quando guardi questa immagine, lo fa prima sulla colonna e poi sulla riga, ad esempio.

Il motivo per cui questo potrebbe essere migliore della media dei colori, è che quando uno dei punti si avvicina al centro di un altro, contribuisce maggiormente al colore finale. Con la media dei colori, tutti i punti contribuiscono allo stesso modo, anche quando un punto è più vicino al centro di un altro punto.

Se tutti e 4 i punti si trovano su posizioni fisse a uguale distanza dal centro, ottieni esattamente il 25% di contributo su tutti i punti, che equivale alla media.

Ciò significa che quando si implementa l'antialiasing semplicemente eseguendo il rendering con una risoluzione 4 volte superiore, quindi eseguendo il campionamento. L'output tra i 2 modi dovrebbe essere lo stesso, per quanto ho capito.

Quindi, quale filtro dovresti usare? Bene, dipende da cosa vuoi e dalla tua situazione. Se selezioni posizioni di subpixel casuali per i tuoi campioni, potrebbe essere meglio usare un'interpolazione bilineare. Se tutti i punti sono fissi e si esegue il rendering con una risoluzione più elevata, la media potrebbe essere utile. Alla fine si tratta solo di alcune cose sub pixel che normalmente non si notano o si notano a malapena, quindi se c'è qualche tipo se AA, allora è abbastanza buono. Ma questa è solo la mia opinione e probabilmente quella dello spettatore medio di animazione 3D o qualcosa del genere.

Un'interpolazione bicubica ti dà un aspetto più liscio. bicubic: inserisci qui la descrizione dell'immagine

bilineare: inserisci qui la descrizione dell'immagine

Che è migliore? Bene, dipende da cosa ti piace e non penso che ci sarà una differenza enorme.

Le mie fonti: https://en.wikipedia.org/wiki/Reconstruction_filter#Image_processing

https://en.wikipedia.org/wiki/Bilinear_interpolation

https://en.wikipedia.org/wiki/Bicubic_interpolation

(Le immagini provengono da Wikipedia e sono di dominio pubblico)

Spero che questo aiuti, voglio solo dire che non sono un professionista su questo, sono solo qualcuno a cui piacciono le cose di computer grafica. Potrebbe essere che ho fatto degli errori. Se è così, dillo e lo cambio!

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.