- Este experimento, que lleva el motion blur hasta su “límite lógico”, redefine el desenfoque de una manera que reduce la diferencia entre el motion smear de la visión humana y la reproducción en pantalla, y lo aplica a animación procedural en tiempo real
- En escenas naturales, los conos de la retina integran temporalmente el estímulo lumínico y producen desenfoque en la etapa del receptor, pero en pantallas de bajo frame rate el video sin blur se ve como fotogramas superpuestos en lugar del smear natural
- El motion blur tradicional promedia el intervalo temporal de un fotograma y se acerca más a una escena natural, pero en objetos rápidos todavía pueden quedar discontinuidades, por lo que una función de obturador (shutter function) que reduzca el peso al inicio y al final produce resultados más naturales
- La implementación en shader en tiempo real evita el multisampling y el ray tracing analítico, y representa los objetos en movimiento como una función de densidad en coordenadas que incluyen el tiempo; luego renderiza la integral temporal con volume ray casting
- El resultado final, “Torusphere Accelerator”, aplica blur a una esfera en órbita y a un toro en rotación prácticamente hasta velocidad infinita, y como no existe una “normal con motion blur”, las normales de superficie se tratan con interpolación aparte
Diferencia entre el movimiento en escenas naturales y la reproducción en pantalla
- El motion blur originalmente era un artefacto de película causado por el movimiento del sujeto mientras el obturador de la cámara estaba abierto, pero se volvió útil porque hace que el video se parezca perceptualmente más a una escena natural
- En 3D y animación, “simular la cámara” y “verse natural” no siempre tienen por qué ser el mismo objetivo
- Para entender un motion blur natural hacen falta cuatro preguntas
- Cómo percibimos el movimiento en una escena natural
- Cómo percibimos una escena reproducida en pantalla
- Cuál es la diferencia perceptual entre ambos casos
- Cómo puede el motion blur de video reducir esa diferencia
Integración temporal de los conos y motion smear
- En entornos luminosos, el procesamiento inicial de la visión humana está a cargo de los conos, y la fototransducción (phototransduction) no ocurre de inmediato
- El retraso del estímulo lumínico puede modelarse como una suavización del estímulo en la dirección temporal
- El ejemplo de los conos de pez dorado de Howlett et al. (2017) muestra la cantidad de fotones que entran al fotorreceptor, la función de ponderación y el “effective stimulus” resultante
- Si se combina la forma de esa función de ponderación con los tiempos de respuesta conocidos de los conos humanos, se puede simular la imagen percibida a partir de la escena de entrada
- El resultado es que incluso en escenas naturales ya existe un desenfoque natural a nivel del fotorreceptor: el motion smear
- La simulación de ejemplo asume que el observador mira un punto fijo y no sigue el objeto con los ojos
Qué hace el motion blur tradicional en video de pantalla
- Al ver una pantalla con una cantidad limitada de fotogramas por segundo, la imagen percibida de un video sin motion blur no se parece al motion smear esperado, sino a fotogramas superpuestos
- Un video con motion blur no muestra cada fotograma como un instante aislado, sino como el promedio de todos los instantes dentro del intervalo temporal que cubre ese fotograma
- Eso es similar a una imagen capturada con una cámara cuyo obturador permanece abierto durante el tiempo de un fotograma
- La imagen percibida con este método se vuelve mucho más parecida al caso de una escena natural
Reducir discontinuidades con una shutter function
- Incluso con motion blur tradicional, a ciertas velocidades de los objetos pueden quedar artefactos de discontinuidad en el motion smear
- En vez de promediar uniformemente todo el intervalo del fotograma, la shutter function da menos peso al inicio y al final del fotograma, y más peso al momento central
- El nombre viene de una analogía con la eficiencia del obturador de una cámara con diafragma, pero aquí el objetivo no es simular una cámara sino elegir una función que reduzca la diferencia perceptual entre pantalla y escena natural
- Este problema se parece mucho a construir una window function en procesamiento de señales, y varias window functions populares dan buenos resultados
- Según pruebas subjetivas, la shutter function se vuelve útil cuando la distancia que recorre el objeto en un fotograma es del mismo orden que su ancho
- A bajas velocidades no hace tanta falta, pero en objetos que se mueven rápido se ve más natural y los cuadros estáticos también se perciben más suaves
- Este enfoque no es la simulación habitual de una cámara, y los intervalos temporales de fotogramas consecutivos pueden superponerse
- En la simulación de cámara común no hay superposición temporal entre fotogramas y muchas veces se descartan los instantes entre ellos
Cómo crear “motion blur infinito” con un shader en tiempo real
- La animación objetivo combina una esfera en órbita y un toro en rotación, y aplica motion blur a ambos prácticamente hasta velocidad infinita
- Para que el resultado final fuera interactivo, se implementó como un shader en tiempo real
- El multisampling consiste en renderizar la escena en varios puntos del tiempo para cada fotograma
- Cuanto mayor es la velocidad del objeto, más aumenta proporcionalmente la cantidad de muestras necesarias
- No encaja con una animación de “velocidad infinita”\n- El motion blur con ray tracing analítico también puede ser una alternativa
- En mallas, existe el método de convertir triángulos en prismas
- También es posible un enfoque puramente analítico, pero aquí podría resultar más pesado
- En ambos casos, el tratamiento de materiales seguiría requiriendo multisampling
- La implementación elegida es más bien un hack que podría llamarse “integrated volume motion blur”
- Un objeto en movimiento se expresa como una función que recibe coordenadas incluyendo el tiempo y devuelve una densidad de 1 en el interior y 0 en el resto
- Al integrar esa función de densidad respecto del tiempo, se obtiene la densidad con motion blur para un intervalo temporal arbitrario
- El resultado se renderiza con volume ray casting
- No es un método exacto como una fotografía, pero permite manejar trayectorias muy largas con rendimiento en tiempo real
Densidad con motion blur de una esfera en órbita
- Una esfera en órbita puede reducirse al problema de un círculo en órbita en una sección transversal 2D
- Se supone que el centro del círculo está a una distancia R del origen y que el radio del círculo es a
- Si en coordenadas polares se calcula el ángulo θ de la superficie del objeto para un radio dado r, se pueden obtener los instantes en que un punto entra y sale del objeto
- Si el objeto orbita con velocidad v, se expresa restando el término temporal vt en la coordenada angular
- En cualquier punto del espacio, la longitud de la intersección entre el intervalo temporal I en el que el objeto existe y el intervalo temporal actual del fotograma F se convierte en la densidad con motion blur
- Si se aplica una shutter function s, se integra multiplicando la densidad por s(t), y si s tiene una integral indefinida S, puede calcularse en la forma
S(max I) - S(min I) - La shutter function basada en seno usada en la animación tiene integral total 1 y está diseñada para que, aunque se superponga en el eje temporal, la suma en cualquier instante siga siendo 1
Toro en rotación y spiric section
- El toro en rotación se trata con el mismo procedimiento que la esfera
- La sección transversal vertical 2D de un toro es una spiric section, también llamada Spiric of Perseus
- Si se toma el minor radius del toro como a, el major radius como b y una sección en una posición específica c, el área interior del toro puede expresarse con una fórmula en coordenadas polares
- Al resolver el ángulo superficial θ se obtienen dos casos, positivo y negativo, y la densidad del solid torus se toma entre ambos límites
- A partir de ahí, los pasos siguientes son iguales a los de la esfera en órbita: calcular el intervalo temporal y aplicar la integral de la shutter function
Torusphere Accelerator final
- La escena final combina la esfera y el toro, y se renderiza con volume ray casting estándar
- Las surface normals requieren tratamiento adicional
- Como no existe el concepto de “normal de superficie con motion blur”, en la implementación se mezclan las normales
- La animación en vivo admite interacciones básicas con mouse y toque
- Puede que no funcione bien en todos los dispositivos, por lo que en la parte superior de la página también se ofrece un video prerenderizado
- El shader final también puede verse en Shadertoy
Puntos debatidos a partir de la discusión en HN
- En la discusión de Hacker News apareció la idea de que la calidad del motion blur puede ser una decisión artística
- También se habló de la importancia de la conversión de espacios de color
- Se debatió además cómo evolucionó históricamente el motion blur en los VFX de cine
- Jurassic Park, una película temprana de CG, se mencionó como un caso que usó una box shutter function físicamente imposible
- El motion blur en juegos sigue siendo un tema polémico
1 comentarios
Opiniones de Hacker News
El compromiso al renderizar o filmar desenfoque de movimiento con una frecuencia de actualización de pantalla finita es que el público puede seguir con la vista los objetos que se mueven en la pantalla.
En la realidad, hacer eso vuelve nítido al objeto. Por eso habría que rastrear el movimiento de los ojos y aplicar desenfoque según el movimiento relativo, o eliminar por completo el desenfoque de movimiento con una frecuencia de actualización infinita. Ninguna de las dos cosas es práctica con la tecnología actual, así que siempre habrá algo que se sienta extraño. Un buen director o diseñador de juegos elegirá la velocidad de obturación o el desenfoque de renderizado anticipando cómo se moverán los ojos del público.
Si el contenido renderizado no puede hablar ese mismo lenguaje visual, entonces falta una herramienta, independientemente de la frecuencia de actualización. Claro que hay ciertos límites, así que si se pudiera notar bien la diferencia a 400 Hz, sería bastante sorprendente.
Lo interesante del contenido renderizado es que esto puede llevarse más lejos. Por ejemplo, se puede jugar con conceptos que uno cree haber entendido, como un ángulo de obturación que supera la duración de un fotograma.
Este método reduce el brillo máximo de la pantalla y requiere una tasa mínima de fotogramas para evitar el parpadeo, pero reduce el desenfoque por persistencia, que es un desenfoque por seguimiento ocular que no existe en la realidad. Para ser exactos, para eliminar por completo el desenfoque por seguimiento habría que mostrar cada fotograma durante un tiempo infinitamente corto, así que no es realista. Aun así, los visores de VR usan este método de destello/estroboscopio.
Esta también es la razón por la que las pantallas CRT y de plasma tenían una claridad de movimiento mucho mejor que las LCD u OLED. Las primeras muestran cada fotograma con un destello breve, mientras que las segundas usan un método sample-and-hold, manteniendo el mismo fotograma durante todo el tiempo del cuadro. Por ejemplo, a 60 Hz se mantiene durante 1/60 de segundo. 60 FPS en un CRT puede verse incluso más fluido que 120 FPS en un OLED.
En juegos, también existe la opción de agregar muchos fotogramas mediante técnicas de reproyección. Se puede aproximar el movimiento real de la cámara sin que el motor tenga que renderizar una gran cantidad de fotogramas costosos. Esto ya se usa también en VR, aunque todavía no hasta tasas de fotogramas muy altas. Este artículo cubre bien los detalles:
https://blurbusters.com/frame-generation-essentials-interpol...
Dicen que unos 1000 FPS mediante reproyección son bastante realistas, así que parece posible resolver el problema del desenfoque por seguimiento sin reducir el brillo de la pantalla.
Esto se puede implementar mediante la salida de escaneo de CRT/OLED, normalmente en modo rolling, o mediante estroboscopía de la retroiluminación en LCD, por lo general a fotograma completo. Sin embargo, si a 24 Hz cada fotograma se muestra brevemente, aparece un parpadeo casi insoportable, por eso los proyectores de cine mostraban cada fotograma de película 2 o 3 veces. A 50 Hz apenas resulta tolerable, así que algunos televisores CRT europeos duplicaban fotogramas de video de 50 Hz a 100 Hz, lo que a veces hacía que los objetos en movimiento se vieran dobles. Para un movimiento óptimamente suave y mínima fatiga ocular, idealmente se necesitan 70–75 Hz o más, pero entonces resulta difícil mostrar video grabado a 60 FPS sin judder ni tearing.
A diferencia de la expectativa de que esto haga que los medios visuales se sientan más realistas, en los juegos da la sensación de hacer que un videojuego se vea como una aproximación barata a una película excesivamente editada.
Tiene sentido para movimientos muy rápidos, cosas que pasan muy cerca o, sobre todo, movimientos que no son desde tu propio punto de vista. Pero se abusa demasiado en situaciones como “el personaje gira rápido”.
Cuando giras la cabeza o los ojos de golpe, no ves una imagen borrosa: ves la nueva imagen, y el cerebro descarta los datos intermedios. Puedes comprobarlo mirando un ojo en el espejo y luego cambiando el foco al otro. ¿Ves que tus ojos o tu cara se vuelvan borrosos?
Si en un juego agregas blur al mover la vista, solo retrasas que se muestre el nuevo campo visual. Es distractor y poco realista.
Una prueba mejor es agitar muy rápido un dedo o la mano mientras los miras. Verás motion blur cuando el dedo se mueva. En algunos casos, incluso se ven “frames” individuales como una imagen residual. Por ejemplo, si miras las luces traseras de autos modernos, los LED no están encendidos continuamente, sino que parpadean muy rápido con PWM. Por eso, si de noche mueves los ojos mirando esas luces traseras, no ves una imagen borrosa sino una sucesión de puntos. Una vez que aprendes este truco, puedes distinguir entre iluminación analógica y PWM según si se ve borroso o como puntos discontinuos.
Pero si estás dentro de un auto o volando por el aire en un juego, la imagen puede distorsionarse mientras das un vistazo. Lo esperable es un blur que se “estire” más cuanto más aceleras, y ese efecto puede hacer que las escenas rápidas sean mucho más interesantes. El problema es que el motion blur está pésimamente implementado casi en todas partes.
Los tres pecados más grandes son desenfocar demasiado lejos los objetos, desenfocar cosas que no deberían desenfocarse y desenfocar toda la escena. El tercero en realidad termina reduciéndose al segundo, así que quizá en la práctica sean dos pecados. Lo más importante es que el motion blur debe ser sutil. Un motion blur bien hecho no vuelve borroso el juego, sino que lo hace verse más realista y fluido.
Si un objeto se mueve 50 píxeles entre frames, el ancho del blur no debería superar los 50 píxeles. De hecho, para hacerlo más discreto, probablemente lo correcto sea algo como 25 píxeles. Pero por alguna razón, los juegos de carreras aplican un montón de blur radial a toda la escena cuando vas rápido, y personalmente creo que eso arruina la escena.
Del mismo modo, los objetos que no se mueven con respecto a la cámara no deberían tener motion blur. Muchos juegos se equivocan en esto. Al girar, desenfocan la escena como posprocesado. Si la escena es completamente estática, tiene sentido, y además es una forma muy eficiente en costo de cómputo. Pero si estás girando para seguir un objeto, el objeto que estás siguiendo no debería verse borroso. En un juego de carreras, si el auto de al lado va a la misma velocidad que yo, ese auto no debería desenfocarse.
La forma segura de conseguir un motion blur correcto es renderizar varios frames completos seguidos y mezclarlos, pero para que se vea bien se necesitan muchísimas muestras. Si no, cuando algo como una línea vertical cruza la pantalla volando, se ve como una sucesión de franjas verticales en lugar de un blur suave.
Probablemente lo mejor sea un enfoque híbrido: renderizar por separado cada objeto de la escena y aplicar un blur de posprocesado por objeto según su dirección de movimiento relativa a la cámara. Aunque manejar el orden en Z puede convertirse en un gran desafío.
En las pocas ocasiones en que pude jugar a 120 FPS, aunque lamentablemente el proyector estaba limitado a 60 Hz, preferí jugar sin motion blur.
Hay un buen panorama general en [1].
Curiosamente, hasta que en 2005 apareció el artículo clásico [2] sobre el modelado de la eficiencia del obturador, todos los renderers usados en producción de VFX utilizaban un obturador de caja. Es decir, el obturador se abría instantáneamente, permanecía abierto durante el tiempo especificado y luego se cerraba instantáneamente.
Si ves escenas con motion blur extremo en películas como “Jurassic Park” o “The Mask”, eso es PhotoRealistic RenderMan usando un obturador de caja.
La primera implementación 1:1 en producción de la parametrización de [2] se hizo el mismo año en que salió el artículo, en [3], y no ha cambiado hasta hoy. La primera obra en la que se usó fue “Charlotte's Web”, y solo se aplicó a los personajes de araña creados por Rising Sun Pictures usando [3].
Pixar también lo agregó unos años después, aunque en [4] lo llevaron un poco demasiado lejos. Hoy en día, la mayoría de los renderers offline tienen esta función y la llaman curva de obturador.
[1] O. Navarro et al.: Motion Blur Rendering: State of the Art (https://citeseerx.ist.psu.edu/doc_view/pid/fc23fb525cafa8fe6...)
[2] Stephenson, Ian: Improving Motion Blur: Shutter Efficiency and Temporal Sampling (https://staffprofiles.bournemouth.ac.uk/display/journal-arti...)
[3] https://www.3delight.com/, ver en especial https://nsi.readthedocs.io/en/latest/nodes.html
[4] https://renderman.pixar.com/resources/RenderMan_20/cameramod...
Parece que la demo se calculó en espacio sRGB. Es decir, está usando valores de brillo no lineales, y creo que de ahí viene la mayor parte de lo antinatural del desenfoque
Para simular un fenómeno físico, debería procesarse con valores de brillo lineales y convertirse a sRGB solo al final
Podría ser distinto si los efectos no lineales de la percepción visual humana compensaran todo esto, pero en ese caso al menos habría que mencionarlo
Voy a revisarlo de nuevo y, si es correcto, actualizaré las figuras interactivas y el texto. El shader principal de “torusphere” probablemente esté bien, porque el motion blur es poco realista y ajustado a mano, pero las primeras figuras interactivas aplican la teoría directamente, así que esta observación sí les aplica. Aun así, no creo que invalide la idea central del texto en general
La demo del toro está increíble. Es interesante cómo una tasa de cuadros alta cambia la percepción del blur
Uso una pantalla de 240 Hz, y en la figura 5 no veo los círculos separados hasta alrededor de 12 rad/s. Incluso a 40 rad/s, mientras se mueve, no alcanzo a notar la diferencia entre las opciones de obturador tradicional y obturador sinusoidal
Solo por la suavidad del movimiento del mouse y la baja latencia, recomiendo muchísimo 240 Hz. Volver a un puntero de mouse de 60 Hz es realmente, realmente difícil
A algunas personas de verdad no les importa. Tampoco entiendo mucho esas discusiones tipo guerra santa sobre latencia de entrada o emuladores de terminal. No siento la diferencia entre trabajar en una consola framebuffer y trabajar por ssh con 50 ms adicionales
Puedo notar la diferencia entre juegos a 30 FPS y 60 FPS, pero solo cuando me fijo. Mientras sea estable y no esté subiendo y bajando entre ambos valores, no me importa demasiado
Pero sí me pregunto si las interfaces con transiciones más suaves dan una mayor sensación de estabilidad, y si las tasas de refresco altas podrían afectar el estado mental con el tiempo
Si el toro y la esfera del fondo están hechos con motion blur, ¿no deberían ser parcialmente transparentes? Se siente raro, como si en algún momento volvieran a ser opacos
Por eso el título es motion blur all the way down
Sin embargo, la luz emitida por un objeto en movimiento debería ser menor que la de un objeto inmóvil. Por eso, a medida que aumenta la distancia, el objeto debería volverse cada vez más oscuro
Esto se aleja de intentar simular una cámara de película y apunta a simular el sistema visual humano. Es una dirección útil
Es dejar de imitar tecnología vieja y acercarse un paso más a la realidad. El motion blur por obturador también podría desaparecer, igual que las impresiones en tono sepia, las películas en blanco y negro a 16 FPS o las ruedas ovaladas causadas por obturadores mecánicos
Reproducir la realidad no es el objetivo. Porque no se puede lograr
Parece que este artículo también llegó porque ambient.garden acaba de aparecer en la portada. Al releerlo, siento que en realidad deberían haber sido dos artículos
La primera parte todavía me gusta. Explora bien qué es el motion blur y qué debería ser en teoría. La segunda parte es una explicación algo frenética y ultra comprimida de cómo funciona el shader para una animación específica de “torusphere” basada en motion blur. Esa parte me resulta útil sobre todo porque, al menos para mí, evita que el código se vuelva completamente incomprensible en este momento. Viéndolo en retrospectiva, la transición entre ambas partes se siente más como lanzarse a un lago congelado. Perdón
Me alegra saber que no era solo por la copa de vino que acababa de tomar
He jugado algunas veces con el motion blur como función de proyección de una extrusión de cuatro dimensiones, pero en el contexto real —video y texturas— termina siendo poco práctico frente al muestreo por hardware con caché. Aun así, este artículo me hace pensar: “¿y si lo intento una vez más?”
La demo de comparación en tiempo real es tremenda. Hasta ese punto, mientras iba siguiendo el texto, sentía mentalmente que lo “entendía”, pero cuando pude alternar directamente motion blur activado/desactivado, la diferencia se volvió realmente evidente
Después de ver motion blur all the way down, por alguna razón terminé pensando en la teoría de cuerdas, los átomos y cómo se formó el universo
Claro que, mientras más profundo vas, todo se vuelve cada vez más extraño