ACTUALITÉ
L'Asynchronous Time Warp de l'Oculus Rift, qu'est-ce que c'est ?

Publié par
Article de la communauté
le 16/04/2016 à 13:02
Bonjour. Il y a pas mal d'incompréhensions sur les améliorations de la version 1.3 du runtime Oculus, et surtout sur l'Asynchronous Time Warp. Je vais tenter d'expliquer en quoi cela consiste, et comment cela fonctionne. Accrochez-vous, on y va !

La carte graphique
Pour comprendre comment marche l'Asynchronous Time Warp, penchons-nous d'abord rapidement sur le fonctionnement de la carte graphique.

Pour la VR actuelle, nous avons besoin de 90 images par secondes. Cela signifie que chaque image sera affichée pendant environ 11 ms. On appellera cela une frame. En VR, le nombre d'images est fixé à 90 par secondes. cela signifie que même si une carte graphique est théoriquement capable de calculer l'image en 1ms, elle la calculera, puis attendra 15 ms avant de l'envoyer (en réalité, il faut prendre en compte le fait que l'application a besoin de faire des calculs avant de donner les instructions à la carte graphique, donc elle n'a pas la totalité de la frame pour 'réfléchir').

Une fois l'image complètement calculée (lumières, ombres, textures,...), la carte graphique applique les éventuels post-process. Il s'agit d'effets modifiant les couleurs et formes de l'image, pour créer une saturation, certains cell-shading, etc.

Le problème de la VR : le motion-to-photon
Sur un écran classique, on parle uniquement d'input-lag. Ce terme un peu barbare signifie simplement que si j'appuie sur le clic gauche de la souris dans un FPS, je ne vais pas immédiatement voir la balle partir de mon pistolet, car Windows va devoir analyser que j'ai appuyé, puis le jeu va devoir défiler ses lignes de codes pour savoir quoi faire de cette information, et la carte graphique va devoir calculer l'image, enfin l'écran doit l'afficher. Admettons que tout cela prenne 50 ms, c'est tout à fait correct, je ne le verrais même pas et cela me paraîtra instantané.

Ok, mais en VR si je tourne la tête, à gauche par exemple, la latence sera identique... et donc l'image affichée sera en retard de 50 ms par rapport à la position réelle de ma tête.
On pourrait se dire que ce n'est trop pas grave, car c'est en dessous du réflexe humain (en réalité, il vaut mieux être en dessus de 40 ms, mais cela reste acceptable), mais c'est sans compter sur l'inconscient, qui a aussi son mot à dire... Le cerveau ne comprend pas pourquoi l'image qu'il voit n'est pas l'image qu'il a prédit, et pense donc que nous sommes drogué, ou intoxiqué. Il déclenche alors un réflexe de survie qui consiste à vidanger l'organisme, dans le doute, et c'est à ce moment là que les nausées apparaissent.

La seule solution est de réduire le motion-to-photon, c'est à dire la latence entre le mouvement de la tête et la modification de l'image, et c'est là qu'intervient l'Asynchronous Time Warp !

L'asynchronous Time Warp, qu'est-ce-que c'est ?
Partons d'un constat : il n'est pas possible de prédire le temps de calcul d'une image par la carte graphique. Afin de garantir qu'elle sera prête avant la fin de l'image en cours, il est donc indispensable de débuter le calcul le plus tôt possible. Mais alors, comment faire pour réduire la latence si on est obligé d'attendre une image entière à glander ?

L'asynchronous Time Warp consiste à laisser la carte graphique calculer l'image normalement (ou presque), mais avant de l'envoyer à l'écran, on récupère la position de l'utilisateur, et on tourne légèrement la caméra.
Attention, il n'est pas question ici de recalculer quoi que ce soit sur l'image, ce serait trop long... on déduit juste la différence entre la rotation de la tête du joueur au début de la frame et sa rotation actuelle, et on 'décale' chaque pixel de la valeur trouvé. Le calcul est rapide et prédictible.

De cette façon, l'input-lag reste toujours égal à 50 ms, mais le motion-to-photon devient largement inférieur (de l'ordre de 20 ms en comptant le rafraichissement de l'écran, car oui, un écran c'est très lent). La latence est suffisamment faible pour que le cerveau ne la perçoive plus, et les nausées disparaissent ! En bonus, l'écran parait beaucoup plus fluide en toute circonstance, même si l'application lague.

Aller plus loin
Si vos oreilles ne saignent pas encore, vous pouvez lire ce chapitre !

- Pour garantir les 90 i/s nécessaires au bon fonctionnement des casques sans tearing (déchirement de l'image), il est important de ne pas afficher une image qui n'est pas complètement calculée. Cependant, il faut bien afficher quelque chose ! Ainsi, si la carte graphique n'arrive pas à suivre le rythme, l'Asynchronous Time Warp affichera l'image précédente décalée de la même manière afin de laisser plus de temps. L'input-lag sera toujours présent, voir légèrement amplifié, mais l'image sera toujours nette.

- Certains post-process semblent être affectés par cette technologie. Pour rappel, les post-process sont calculés après l'image, et ils peuvent donc potentiellement se retrouver en conflit avec l'Asynchronous Time Warp... certains effets sont ratés, d'autres font ramer des applications auparavant parfaitement fluides, et d'autres encore disparaissent complètement ! Nul doute que les moteurs de créations compatibles avec la VR se mettront vite à jour.

- Il est également intéressant de savoir que le Time Warp ne gère pas les translations, ce qui fait que l'image n'est pas parfaitement reproduite. Sans rentrer dans les détails, si on bouge sa tête, on fait apparaître des éléments qui était autrefois cachés par d'autres éléments plus proches de nous... Comme nous ne voulons pas calculer de nouveaux pixels (ce serait trop long), Time Warp ne prend en compte que les rotations. Étant donné que le cou ne se trouve pas parfaitement sous les yeux, chaque rotation de la tête est également une translation, certes très faible mais existante. Cette translation n'étant pas pris en compte, la 3D que nous percevons dans un casque VR est légèrement fausse, mais les erreurs d'approximation sont bien trop faibles pour être perceptibles. Il est question sur le forum Oculus d'une gestion des translations, dans certaines conditions très précises, mais je ne trouve aucune preuve réelle de son application dans l'état actuel.

- Au delà de l'Asynchronous Time Warp, d'autres améliorations ont été apportées, notamment sur les anti-aliasing (qui lissent les textures), ou le calcul des deux images qui partagent le plus d'informations possible. Les détails se trouvent sur les sites d'Oculus, Nvidia, AMD,...


Si vous voulez en savoir plus sur le Time Warp, je vous conseille la vidéo de eVRerydayVR, disponible ci-dessous.
 


Tag(s) associé(s) : NVIDIA, AMD, asynchronous time warp, Oculus, Hardware, Technologie, Actualité, Oculus Rift
32 COMMENTAIRES

Connectez-vous pour commenter.