¿Por qué usar un filtro de tienda en el trazado de ruta?


12

Las 99 líneas del trazador de ruta C Smallpt representan una cuadrícula de subpíxeles de 2x2 por cada píxel que pretende renderizar y luego hace un filtro de tienda para combinarlas.

Hay una presentación interesante que explica el código aquí , y menciona el filtro de la tienda pero no explica por qué está allí.

¿Alguien puede explicar por qué sería preferible un filtro de tienda en este caso sobre un cuadro borroso (solo promediando las muestras)?

¿Sería de mayor calidad ir con algo mejor que un filtro de tienda, como la interpolación de hermita bicúbica?

Respuestas:


13

El filtro antialiasing ideal teórico para datos muestreados discretamente es un filtro sinc , porque elimina perfectamente todas las frecuencias más altas que la frecuencia de Nyquist, dejando solo todas las más bajas. Por lo tanto, hasta cierto punto, podemos esperar filtros antialiasing que se parezcan más al filtro sinc para producir imágenes de mejor calidad.

El filtro de tienda (filtro triangular) ciertamente se parece más al pico central del filtro de sinc que al filtro de caja:

filtros de sinc, triángulo y caja

Un filtro bicúbico (p. Ej., Mitchell-Netravali) podría capturar la forma del seno incluso con mayor precisión, incluidos sus dos primeros lóbulos negativos.

La realidad de la selección de filtros es un poco más sutil que "sinc aproximado tanto como sea posible", ya que existen diferentes tipos de artefactos que pueden ser generados por filtros antialiasing "no ideales", como aliasing, overblurring y ringing. Además, los diferentes filtros pueden ser más o menos computacionalmente caros. Entonces es un juego de tratar de intercambiar los diferentes artefactos entre sí y contra el rendimiento. Diferentes escenas / imágenes pueden favorecer una opción u otra, y también es en parte un juicio estético.

En cuanto a por qué smallpt usa un filtro de tienda en particular, supongo que una combinación de rendimiento (es un filtro rápido para evaluar) y brevedad, se puede hacer en un par de líneas de código, mientras que un filtro bicúbico tomaría un montón más código.

Por cierto, smallpt en realidad usa una cuadrícula de subpíxeles de 2x2 y coloca un filtro de tienda en cada subpíxel , luego promedia los resultados de los cuatro subpíxeles. Entonces, el efecto general es, curiosamente, el de la suma de cuatro carpas, que termina pareciendo una pirámide con una parte superior plana:

filtros de tienda de subpíxeles

No estoy seguro de si esto fue intencional, o simplemente resultó ser la forma en que funcionó. Supongo que esto da como resultado una imagen algo más nítida que si se usara un solo filtro de tienda por píxel (debido al soporte más estrecho), pero probablemente también un alias más visible.


¡No puedo evitar decir gracias! En realidad, primero entiendo esto como muestreo estratificado con 4 estratos. Y hago que el número de "estratos" sea personalizable, como 9, 16 ... Ahora, sé que es un filtro "trapezoidal" (no tan común en otros renderizadores). Y como el número de mis "estratos" tiende a ser infinito, el filtro se convierte en un filtro de caja, donde estoy pintando el lirio ... ¡Interesante!
chaosink

3

Acabo de mirar los artículos de Wikipedia sobre la interpolación bilineal. Un filtro de tienda es una especie de interpolación bilineal. Una interpolación bilineal se interpola en 2 dimensiones. Primero se interpola linealmente en una dimensión y luego en la otra.

ingrese la descripción de la imagen aquí

Cuando miras esta imagen, primero lo hace en la columna y luego en la fila, por ejemplo.

La razón por la que esto podría ser mejor que promediar colores, es que cuando uno de los puntos se acerca más al centro que otro, contribuye más al color final. Al promediar los colores, todos los puntos contribuyen por igual, incluso cuando un punto está más cerca del centro que otro.

Si los 4 puntos están en posiciones fijas a una distancia igual del centro, entonces obtienes exactamente un 25% de contribución en todos los puntos, eso es lo mismo que promediar.

Esto significa que cuando implementa el anti-alias simplemente renderizando a una resolución 4 veces mayor, y luego bajando la muestra. La salida entre las 2 formas debería ser la misma, por lo que yo entiendo.

Entonces, ¿qué filtro debes usar? Bueno, depende de lo que quieras y de tu situación. Si elige ubicaciones aleatorias de subpíxeles para sus muestras, entonces podría ser mejor usar una interpolación bilineal. Si todos los puntos son fijos y solo renderiza con una resolución más alta, el promedio podría ser útil. Al final, esto es solo algunas cosas de subpíxeles que normalmente no se notan o apenas se notan, por lo que si hay algún tipo de AA, entonces es lo suficientemente bueno. Pero esa es solo mi opinión y probablemente la del espectador promedio de animación 3D o algo así.

Una interpolación bicúbica le da un aspecto más suave. Bicúbico: ingrese la descripción de la imagen aquí

Bilineal: ingrese la descripción de la imagen aquí

¿Cual es mejor? Bueno, depende de lo que te guste, y no creo que haya una gran diferencia.

Mis fuentes: https://en.wikipedia.org/wiki/Reconstruction_filter#Image_processing

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

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

(Las imágenes son de Wikipedia y son de dominio público)

Espero que esto ayude, solo quiero decir que no soy un profesional en esto, solo soy alguien a quien simplemente le gustan las cosas de gráficos por computadora. Podría ser que cometí algunos errores. Si es así, ¡solo dilo y lo cambio!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.