- Cette expérimentation, qui pousse le motion blur jusqu’à sa « limite logique », redéfinit le flou en réduisant l’écart entre le motion smear de la vision humaine et le rendu sur écran, puis l’applique à une animation procédurale en temps réel
- Dans les scènes naturelles, les cônes de la rétine intègrent temporellement les stimuli lumineux, produisant un flou au niveau des récepteurs ; mais sur un écran à faible fréquence d’images, une vidéo sans flou ressemble à des images superposées plutôt qu’au smear naturel
- Le motion blur traditionnel moyenne l’intervalle temporel d’une image pour se rapprocher d’une scène naturelle, mais des discontinuités peuvent subsister avec des objets rapides ; une fonction d’obturation (shutter function) qui réduit le poids du début et de la fin donne un résultat plus naturel
- L’implémentation en shader temps réel évite le multisampling et le ray tracing analytique, représente les objets en mouvement comme une fonction de densité dans des coordonnées incluant le temps, puis rend l’intégrale temporelle par volume ray casting
- Le « Torusphere Accelerator » final applique ainsi un flou à une sphère en orbite et à un tore en rotation jusqu’à des vitesses pratiquement infinies, et comme il n’existe pas de « normales floutées par le mouvement », les normales de surface sont interpolées séparément
Différence entre le mouvement dans une scène naturelle et sa restitution à l’écran
- Le motion blur était à l’origine un artefact de pellicule produit quand le sujet bouge alors que l’obturateur de la caméra est ouvert, mais il est devenu utile parce qu’il rend l’image perceptuellement plus proche d’une scène naturelle
- En 3D et en animation, « simuler une caméra » et « paraître naturel » ne sont pas toujours le même objectif
- Pour obtenir un motion blur naturel, il faut se poser quatre questions
- Comment perçoit-on le mouvement dans une scène naturelle ?
- Comment perçoit-on une scène rejouée sur un écran ?
- Quelle est la différence perceptive entre les deux ?
- Comment le motion blur vidéo peut-il réduire cet écart ?
Intégration temporelle des cônes et motion smear
- En environnement lumineux, le traitement initial de la vision humaine est assuré par les cônes, et la phototransduction ne se produit pas instantanément
- Le retard du stimulus lumineux peut être modélisé comme un lissage du stimulus dans le temps
- L’exemple de cônes de poisson rouge de Howlett et al. (2017) montre le nombre de photons entrant dans le photorécepteur, une fonction de pondération et le résultat appelé « effective stimulus »
- En combinant la forme de cette fonction de pondération avec les temps de réponse connus des cônes humains, on peut simuler l’image perçue à partir de la scène d’entrée
- Le résultat montre que même dans une scène naturelle, un flou naturel au niveau du photorécepteur, le motion smear, existe déjà
- La simulation d’exemple suppose que l’observateur fixe un point sans suivre l’objet des yeux
Ce que fait le motion blur traditionnel sur une vidéo affichée
- Lorsqu’on regarde un écran limité en nombre d’images par seconde, l’image perçue d’une vidéo sans motion blur ressemble à des images superposées plutôt qu’au motion smear attendu
- Une vidéo avec motion blur ne montre pas un instant unique à chaque image ; elle moyenne tous les instants couverts par l’intervalle temporel de cette image
- Cela ressemble à une image prise avec une caméra dont l’obturateur reste ouvert pendant la durée d’une image
- L’image perçue obtenue est alors bien plus proche de celle d’une scène naturelle
Réduire les discontinuités avec une fonction d’obturation
- Même avec le motion blur traditionnel, des artefacts de discontinuité peuvent subsister pour certaines vitesses d’objet
- Une fonction d’obturation ne moyenne pas uniformément tout l’intervalle d’une image ; elle donne moins de poids au début et à la fin, et davantage au centre
- Le nom vient d’une analogie avec l’efficacité de l’obturateur d’une caméra à diaphragme, mais ici le but n’est pas de simuler une caméra : il s’agit de choisir une fonction qui réduit l’écart perceptif entre écran et scène naturelle
- Le problème ressemble fortement à la construction d’une fonction fenêtre (window function) en traitement du signal, et plusieurs fonctions fenêtre populaires donnent de bons résultats
- D’après des tests subjectifs, la fonction d’obturation devient utile lorsque la distance parcourue par l’objet durant une image est du même ordre que sa largeur
- À faible vitesse, elle est peu nécessaire, mais pour les objets rapides elle paraît plus naturelle et les images fixes semblent aussi plus douces
- Cette approche ne correspond pas à la simulation habituelle d’une caméra, et les plages temporelles d’images successives peuvent se chevaucher
- Dans une simulation de caméra classique, il n’y a généralement pas de chevauchement temporel entre les images, et les instants entre deux images sont souvent ignorés
Créer un « motion blur infini » avec un shader temps réel
- L’animation visée combine une sphère en orbite et un tore en rotation, tous deux floutés par le mouvement jusqu’à des vitesses pratiquement infinies
- Pour rendre le résultat final interactif, l’auteur l’a implémenté en shader temps réel
- Le multisampling consiste à rendre la scène à plusieurs instants pour chaque image
- Plus la vitesse des objets augmente, plus le nombre d’échantillons nécessaires croît proportionnellement
- Cela ne convient pas à une animation à « vitesse infinie »
- Le motion blur par ray tracing analytique peut aussi servir d’alternative
- Sur un mesh, une méthode consiste à transformer les triangles en prismes
- Une approche purement analytique est également possible, mais elle serait ici plus lourde
- Dans les deux cas, le traitement des matériaux nécessiterait encore du multisampling
- L’implémentation retenue est une méthode proche du hack qu’on pourrait appeler « integrated volume motion blur »
- Un objet en mouvement est représenté par une fonction qui prend en entrée des coordonnées incluant le temps et renvoie une densité valant 1 à l’intérieur de l’objet, 0 ailleurs
- En intégrant cette fonction de densité par rapport au temps, on obtient une densité floutée par le mouvement sur n’importe quel intervalle temporel
- Le résultat est rendu par volume ray casting
- Ce n’est pas une méthode photographiquement exacte, mais elle permet de traiter des trajectoires très longues avec des performances temps réel
Densité de motion blur d’une sphère en orbite
- Une sphère en orbite peut se ramener, dans une section 2D, au problème d’un cercle en orbite
- Le centre du cercle est à une distance R de l’origine, et son rayon vaut a
- En coordonnées polaires, pour un rayon donné r, on peut trouver l’angle θ de la surface de l’objet et calculer les instants où un point entre dans l’objet puis en sort
- Si l’objet orbite à la vitesse v, cela s’exprime en retranchant un terme temporel vt dans la coordonnée angulaire
- Pour un point donné de l’espace, la longueur de l’intersection entre l’intervalle temporel I où l’objet est présent et l’intervalle temporel courant F de l’image donne la densité floutée par le mouvement
- En appliquant une fonction d’obturation s, on intègre le produit de la densité et de s(t), et si s admet une primitive S, on peut calculer cela sous la forme
S(max I) - S(min I) - La fonction d’obturation sinusoïdale utilisée dans l’animation a une intégrale égale à 1 et est conçue pour que, même en cas de chevauchement sur l’axe du temps, la somme en tout instant vaille toujours 1
Tore en rotation et spiric section
- Le tore en rotation est traité selon la même procédure que la sphère
- La section verticale 2D d’un tore est une spiric section, aussi appelée spirique de Persée
- En prenant a pour le rayon mineur du tore, b pour son rayon majeur, et en coupant à une position c donnée, on peut exprimer en coordonnées polaires la région intérieure du tore
- On résout l’angle de surface θ pour obtenir deux cas, positif et négatif, et on utilise la zone comprise entre ces deux frontières comme densité du solid torus
- Les étapes suivantes sont identiques à celles de la sphère en orbite : calcul de l’intervalle temporel puis intégration avec la fonction d’obturation
Torusphere Accelerator final
- La scène finale combine la sphère et le tore, puis les rend avec un volume ray casting standard
- Les surface normals demandent un traitement supplémentaire
- Comme il n’existe pas de « normale de surface floutée par le mouvement », l’implémentation mélange les normales
- L’animation en direct prend en charge les interactions de base à la souris et au toucher
- Comme cela peut ne pas bien fonctionner sur tous les appareils, une vidéo pré-rendue est aussi fournie en haut de la page
- Le shader final est également visible sur Shadertoy
Points soulevés dans la discussion HN
- Dans la discussion sur Hacker News, certains ont présenté la qualité du motion blur comme un choix artistique
- L’importance de la conversion d’espace colorimétrique a également été évoquée
- La discussion a aussi porté sur l’évolution historique du motion blur dans les VFX de cinéma
- Jurassic Park, film pionnier du CG, a été cité comme exemple d’usage d’une box shutter function physiquement impossible
- Dans le jeu vidéo, le motion blur reste un sujet controversé
1 commentaires
Commentaires sur Hacker News
Le compromis lorsqu’on rend ou filme du flou de mouvement avec une fréquence de rafraîchissement finie tient au fait que le public peut suivre des yeux un objet en mouvement à l’écran.
Dans la réalité, cela rend l’objet net. Il faudrait donc soit suivre les mouvements des yeux et appliquer le flou en fonction du mouvement relatif, soit supprimer complètement le flou de mouvement avec une fréquence de rafraîchissement infinie. Aucune de ces deux options n’est praticable avec la technologie actuelle, donc quelque chose paraîtra toujours un peu étrange quelque part. Un bon réalisateur ou game designer choisira la vitesse d’obturation ou le flou de rendu en anticipant la façon dont les yeux du public vont se déplacer.
Si les contenus rendus ne peuvent pas parler le même langage visuel, il leur manque un outil, quelle que soit la fréquence de rafraîchissement. Bien sûr, il y a certaines limites, et il serait assez étonnant de percevoir correctement la différence à 400 Hz.
Ce qui est intéressant avec les contenus rendus, c’est qu’on peut pousser cela plus loin. On peut par exemple jouer avec des concepts qu’on pensait déjà comprendre, comme un angle d’obturation qui dépasse la durée d’une image.
Cette méthode réduit la luminosité maximale de l’écran et nécessite une fréquence d’images minimale pour éviter le scintillement, mais elle réduit le flou de persistance, un flou de suivi oculaire qui n’existe pas dans la réalité. Plus précisément, pour éliminer complètement le flou de suivi, il faudrait afficher chaque image pendant un temps infiniment court, ce qui n’est pas réaliste. Les casques VR utilisent néanmoins ce type d’affichage flash/stroboscopique.
C’est aussi la raison pour laquelle les écrans CRT et plasma avaient une netteté de mouvement bien meilleure que les LCD ou OLED. Les premiers affichent brièvement chaque image sous forme d’éclair, tandis que les seconds utilisent une approche sample-and-hold, où la même image est maintenue pendant toute la durée de la frame. Par exemple, à 60 Hz, elle est maintenue pendant 1/60 seconde. Du 60 FPS sur CRT peut même paraître plus fluide que du 120 FPS sur OLED.
Dans les jeux, on peut aussi ajouter beaucoup d’images avec des techniques de reprojection. Cela permet d’approximer le mouvement réel de la caméra sans que le moteur ait à rendre massivement des frames coûteuses. C’est déjà utilisé en VR, même si pas encore jusqu’à des fréquences d’images très élevées. Cet article couvre bien le sujet :
https://blurbusters.com/frame-generation-essentials-interpol...
Il paraît qu’atteindre environ 1000 FPS par reprojection est assez réaliste, ce qui pourrait résoudre le problème du flou de suivi sans réduire la luminosité de l’écran.
Cela peut être mis en œuvre via le balayage d’affichage des CRT/OLED, généralement en mode rolling, ou via le strobing du rétroéclairage LCD, le plus souvent sur toute l’image. Mais à 24 Hz, afficher chaque image brièvement provoque un scintillement difficilement supportable, si bien que les projecteurs de cinéma montraient chaque image du film 2 à 3 fois. À 50 Hz, c’est tout juste tolérable, et certains téléviseurs CRT européens doublaient donc les images des vidéos 50 Hz en 100 Hz, avec pour résultat que les objets en mouvement pouvaient apparaître en double. Pour un mouvement idéalement fluide et une fatigue oculaire minimale, il faudrait au moins 70 à 75 Hz, mais il devient alors difficile d’afficher des vidéos enregistrées à 60 FPS sans saccades ni déchirures.
Contrairement à l’idée que cela rendrait les médias visuels plus réalistes, dans les jeux, j’ai l’impression que cela donne surtout aux jeux vidéo l’apparence d’une approximation bon marché d’un film surmonté
Cela a du sens pour quelque chose qui bouge très vite, passe très près, ou surtout pour un mouvement qui n’est pas lié à son propre point de vue. Mais c’est beaucoup trop utilisé dans des situations comme « le personnage tourne rapidement »
Quand on tourne brusquement la tête ou les yeux, on ne voit pas une image floue : on voit une nouvelle image, et le cerveau jette les données intermédiaires. On peut s’en rendre compte en regardant un œil dans un miroir puis en déplaçant la mise au point vers l’autre œil. Voyez-vous vos yeux ou votre visage devenir flous ?
Ajouter du flou quand on déplace la caméra dans un jeu ne fait que retarder l’affichage du nouveau champ de vision. C’est distrayant et irréaliste
Un meilleur test consiste à regarder un doigt ou une main que l’on agite très rapidement. On verra du flou de mouvement pendant que le doigt bouge. Dans certains cas, la persistance rétinienne permet même de voir des « frames » individuelles. Par exemple, avec les feux arrière de voitures récentes, les LED ne restent pas allumées en continu : elles clignotent très vite en PWM. Ainsi, la nuit, si l’on bouge les yeux en regardant des feux arrière, on ne voit pas une image floue, mais une suite de points. Une fois qu’on connaît cette astuce, on peut distinguer un éclairage analogique d’un éclairage PWM selon qu’il apparaît flou ou sous forme de points discontinus
En revanche, lorsqu’on est dans une voiture ou qu’on vole dans les airs dans un jeu, l’image peut être déformée pendant qu’on jette un coup d’œil. Ce à quoi on s’attend, c’est un flou qui s’étire avec l’accélération, et ce type d’effet peut rendre les scènes rapides bien plus intéressantes. Le problème, c’est que le flou de mouvement est presque partout très mal implémenté
Les trois plus grands péchés sont de rendre les objets flous sur une trop grande distance, de flouter ce qui ne devrait pas l’être, et de flouter toute la scène. Le troisième se ramène finalement au deuxième, donc il n’y a peut-être en réalité que deux péchés. Le plus important est que le flou de mouvement doit être subtil. Un bon flou de mouvement ne rend pas un jeu indistinct ; il le rend plus réaliste et plus fluide
Si un objet se déplace de 50 pixels entre deux frames, la largeur du flou ne devrait pas dépasser 50 pixels. En fait, pour un effet plus discret, quelque chose comme 25 pixels serait probablement plus approprié. Pourtant, pour une raison quelconque, les jeux de course appliquent une grosse dose de flou radial à toute la scène quand on roule vite, et personnellement je trouve que cela ruine l’image
De même, les objets qui ne bougent pas par rapport à la caméra ne devraient pas avoir de flou de mouvement. Beaucoup de jeux se trompent là-dessus. Lors d’une rotation, ils floutent la scène en post-traitement. Si la scène est entièrement statique, cela se tient, et c’est aussi très efficace en coût de calcul. Mais si l’on tourne pour suivre un objet, l’objet que l’on suit ne devrait pas devenir flou. Dans un jeu de course, si une voiture à côté de moi roule à la même vitesse que moi, elle ne devrait pas être floutée
La méthode sûre pour obtenir un flou de mouvement correct consiste à rendre plusieurs frames complètes successives puis à les mélanger, mais il faut énormément d’échantillons pour que le résultat soit beau. Sinon, lorsqu’une ligne verticale traverse l’écran, elle ressemble à une succession de bandes verticales plutôt qu’à un flou lisse
La meilleure solution est probablement une approche hybride : rendre chaque objet de la scène séparément, puis appliquer un flou en post-traitement par objet, selon sa direction de déplacement relative à la caméra. Le traitement de l’ordre Z peut toutefois devenir un gros défi
Les rares fois où j’ai pu jouer à 120 FPS, même si le projecteur était malheureusement limité à 60 Hz, j’ai préféré jouer sans flou de mouvement
On trouve un bon aperçu dans [1]
Fait intéressant, jusqu’à la publication en 2005 d’un article classique [2] sur la modélisation de l’efficacité de l’obturateur, tous les moteurs de rendu utilisés en production VFX employaient un obturateur rectangulaire. Autrement dit, l’obturateur s’ouvrait instantanément, restait ouvert pendant la durée spécifiée, puis se refermait instantanément
Si vous regardez des scènes avec un flou de mouvement extrême dans des films comme “Jurassic Park” ou “The Mask”, il s’agit de PhotoRealistic RenderMan avec un obturateur rectangulaire
La première implémentation 1:1 en production de la paramétrisation de [2] a été réalisée la même année que l’article, dans [3], et elle n’a pas changé jusqu’à aujourd’hui. La première œuvre à l’utiliser a été “Charlotte's Web”, et cela ne s’appliquait qu’aux personnages d’araignées créés par Rising Sun Pictures avec [3]
Pixar l’a également ajouté quelques années plus tard, mais l’a poussé un peu trop loin dans [4]. Aujourd’hui, la plupart des moteurs de rendu offline disposent de cette fonction et l’appellent courbe d’obturateur
[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/, voir en particulier https://nsi.readthedocs.io/en/latest/nodes.html
[4] https://renderman.pixar.com/resources/RenderMan_20/cameramod...
La démo semble avoir été calculée dans l’espace sRGB. Autrement dit, elle utilise des valeurs de luminance non linéaires, et c’est probablement de là que vient l’essentiel du caractère peu naturel du flou
Pour simuler un phénomène physique, il faut traiter les valeurs de luminance en linéaire et ne convertir en sRGB qu’à la toute fin
Ce serait différent si les effets non linéaires de la perception visuelle humaine compensaient entièrement cela, mais dans ce cas il faudrait au moins le mentionner
Je vais revérifier, et si c’est bien le cas, je mettrai à jour les figures interactives et le texte. Le shader principal du « torusphere » devrait aller, car son flou de mouvement est irréaliste et ajusté à la main, mais les premières figures interactives appliquent directement la théorie, donc la remarque les concerne. Cela dit, je ne pense pas que cela invalide l’idée centrale du texte dans son ensemble
La démo du tore est vraiment superbe. Il est intéressant de voir comment une fréquence d’images élevée change la perception du flou
J’utilise un écran 240 Hz, et dans la figure 5 je ne vois pas les cercles détachés jusqu’à environ 12 rad/s. Même à 40 rad/s, je ne perçois pas la différence entre les options d’obturateur traditionnel et d’obturateur sinusoïdal pendant le mouvement
Rien que pour la fluidité des mouvements de la souris et la faible latence, je recommande vivement le 240 Hz. Revenir à un pointeur de souris en 60 Hz est vraiment, vraiment difficile
Certaines personnes n’y prêtent vraiment pas attention. Je ne comprends pas bien non plus les débats du genre latence d’entrée ou guerres saintes autour des émulateurs de terminal. Je ne sens pas la différence entre travailler dans une console framebuffer et travailler en ssh avec 50 ms de plus
Je peux distinguer un jeu à 30 FPS d’un jeu à 60 FPS, mais seulement si j’y fais attention. Tant que c’est stable et que ça ne monte pas et ne descend pas entre les deux valeurs, ça ne me dérange pas vraiment
En revanche, je me demande si une interface avec des transitions plus douces ne donne pas une impression de plus grande stabilité, et si un taux de rafraîchissement élevé pourrait, avec le temps, influencer l’état mental
Si le tore et la sphère derrière sont produits par du flou de mouvement, ne devraient-ils pas être partiellement transparents ? À certains moments, on dirait qu’ils redeviennent opaques, ce qui paraît étrange
C’est pour cela que le titre est motion blur all the way down
En revanche, la lumière émise par l’objet en mouvement devrait être plus faible que celle d’un objet immobile. Donc, plus la distance augmente, plus l’objet devrait devenir sombre
Cela s’éloigne de l’idée de simuler une caméra argentique pour tenter de simuler le système visuel humain. C’est une direction utile
On cesse d’imiter une vieille technologie pour se rapprocher d’un pas de la réalité. Le flou de mouvement à obturateur pourrait disparaître comme les tirages sépia, les films muets en noir et blanc à 16 FPS, ou les roues elliptiques dues aux obturateurs mécaniques
La reproduction de la réalité n’est pas un objectif. Parce qu’elle est impossible à atteindre
ambient.garden vient d’arriver en page d’accueil, donc j’imagine que cet article aussi. En le relisant, je me dis qu’il aurait en fait dû être deux articles
J’aime toujours la première partie. Elle creuse correctement ce qu’est le flou de mouvement et ce qu’il devrait être en théorie. La deuxième partie est une explication un peu frénétique et ultra-condensée du fonctionnement du shader pour une animation « torusphere » spécifique fondée sur le flou de mouvement. Cette partie m’est surtout utile, au moins à moi, parce qu’elle empêche le code de devenir totalement incompréhensible à ce stade. Avec le recul, la transition entre les deux parties ressemble plutôt à un plongeon dans un lac gelé. Désolé
Je suis rassuré de voir que ce n’était pas seulement à cause du verre de vin que je venais de boire
J’ai déjà joué plusieurs fois avec le flou de mouvement comme fonction de projection d’une extrusion en quatre dimensions, mais dans le contexte réel, c’est-à-dire la vidéo et les textures, cela devient impraticable par rapport à l’échantillonnage matériel avec mise en cache. Malgré tout, cet article me donne envie de me dire : « allez, juste une fois de plus »
La démo de comparaison en temps réel est incroyable. Jusqu’à ce point, en suivant l’explication, j’avais l’impression d’avoir « compris » intellectuellement, mais dès qu’il a été possible d’activer/désactiver directement le flou de mouvement, la différence est devenue vraiment évidente
Après avoir vu motion blur all the way down, je me suis mis, je ne sais pourquoi, à penser à la théorie des cordes, aux atomes et à la manière dont l’univers a été créé
Bien sûr, plus on creuse, plus cela devient étrange