Nel ray tracing / path tracing, uno dei modi più semplici per anti-alias l'immagine è quello di sostituire i valori dei pixel e fare una media dei risultati. IE. invece di sparare ad ogni campione attraverso il centro del pixel, compensi i campioni di una certa quantità.
Nella ricerca su Internet, ho trovato due metodi leggermente diversi per farlo:
- Generare i campioni come desiderato e pesare il risultato con un filtro
- Un esempio è PBRT
- Genera i campioni con una distribuzione uguale alla forma di un filtro
- Due esempi sono smallpt e il Tungsten Renderer di Benedikt Bitterli
Genera e pesa
Il processo di base è:
- Crea campioni come preferisci (sequenze casuali, stratificate, a bassa discrepanza, ecc.)
- Offset il raggio della videocamera usando due campioni (xey)
- Rendi la scena con il raggio
- Calcola un peso utilizzando una funzione di filtro e la distanza del campione in riferimento al centro del pixel. Ad esempio, Box Filter, Filter Tent, Gaussian Filter, ecc.)
- Applica il peso al colore dal rendering
Genera sotto forma di un filtro
La premessa di base è di utilizzare il campionamento per trasformazioni inverse per creare campioni distribuiti in base alla forma di un filtro. Ad esempio un istogramma di un campione distribuito a forma di gaussiano sarebbe:
Questo può essere fatto esattamente, oppure inserendo la funzione in un pdf / cdf discreto. smallpt utilizza l'esatto cdf inverso di un filtro tenda. Esempi di metodo di binning sono disponibili qui
Domande
Quali sono i pro e i contro di ciascun metodo? E perché dovresti usarne uno sopra l'altro? Posso pensare ad alcune cose:
Generate and Weigh sembra essere il più robusto, consentendo qualsiasi combinazione di qualsiasi metodo di campionamento con qualsiasi filtro. Tuttavia, è necessario tenere traccia dei pesi in ImageBuffer e quindi eseguire una risoluzione finale.
Genera nella forma di un filtro può supportare solo forme di filtro positive (es. No Mitchell, Catmull Rom o Lanczos), dal momento che non puoi avere un pdf negativo. Ma, come accennato in precedenza, è più facile da implementare, poiché non è necessario tenere traccia dei pesi.
Tuttavia, alla fine, immagino che tu possa pensare al metodo 2 come a una semplificazione del metodo 1, poiché utilizza essenzialmente un peso implicito del filtro box.