Premières images de playplast avec des mauvais matériaux dans Maya : displayPref à la rescousse
Par Narann le dimanche, 21 juillet 2019, 14:34 - Script et code - Lien permanent
Si vous faites des playblasts déportés, il y a de fortes chances que vous mettiez une machine dédiée qui ouvre une session graphique de Maya, ouvre (par exemple) votre scène d'animation, puis lance le playblast. Cela faisant, il est possible que les premières images de votre playblast n'aient pas tout les matériaux et textures (surfaces vertes), ce qui est assez gênant. :casseTeteMur:
Dans ce billet, je vous propose d'essayer de comprendre le problème et de regarder comment le résoudre. :hehe:
Description du problème
Depuis un petit moment, les développeurs de Maya tentent d’isoler l’interface graphique afin que cette dernière ne gèle jamais. Ainsi, le chargement des textures et la préparation des matériaux du viewport se font en arrière-plan. Maya est ensuite informé de la disponibilité de ces ressources. Il y a alors un blocage de quelques millisecondes et les textures et matériaux apparaissent.
Ce procédé augmente la durée totale du chargement (x 1,1 d’après la documentation), mais le fait que ce chargement soit fait en arrière-plan, sans bloquer l’utilisateur, en diminue fortement la perception.
Le mode « Parallel » utilise un thread séparé, dédié à la construction des matériaux et aux demandes de chargement des textures, vous permettant de continuer à travailler sur la scène pendant que les matériaux se construisent et que les textures se chargent. Le temps de chargement total est généralement 1,1 fois supérieur à celui du mode « Immediate ».
(traduction de la documentation)
Le problème, pour nos playblast, vient du fait que Maya n’attend pas que tout soit chargé avant de le démarrer, ce dernier calculant une, voir plusieurs, images possiblement incomplètes. Bien entendu, le problème n’apparaît pas lors d’une utilisation manuelle de Maya, car les matériaux et textures ont le temps de se charger. :zinzin:
C’est peut-être un bug. J’ai, en effet, tendance à croire que le but de la commande playblast est de faire un… playblast et donc, que Maya devrait attendre que toutes les ressources nécessaires à l’image soit chargées avant de démarrer. Dans tous les cas, ce n’est pas ce qu’il fait, nous laissant avec des animateurs, réalisateur et superviseurs mécontents (pléonasme ? :trollface: ).
Vous vous en doutez, il faut qu’on passe le chargement des matériaux et des textures en « Immediate », ce qui aura pour effet de bloquer Maya jusqu’à ce que tout ce qui est nécessaire à l’image soit chargé. :redface:
Il y a deux façons de faire ça. :sourit:
Via les préférences
Vous pouvez résoudre le problème localement en passant par les préférences de l’utilisateur : Display > Heads Up Display > Material Loading Details. (voir la page de documentation précédente).
Comme vous vous en doutez, cette solution est loin d’être optimale : Si vous gérez une ferme de calcul, il peut être contraignant d’avoir à modifier les préférences sur chaque machine.
Via la commande displayPref
Cette commande permet de manipuler les paramètres globaux d’affichage. Depuis Maya 2016 (J’ai vérifié…), les développeurs ont ajouté un argument dédié : materialLoadingMode.
Cet argument, peut prendre trois valeurs (fichtre, je suis sûr qu’il vous tarde de savoir lesquels) :
- immediate
- deferred
- parallel
Comme vous vous en doutez, l’argument immediate résoudra votre problème :
import maya.cmds as cmds
cmds.displayPref(materialLoadingMode='immediate')
Note concernant l’argument court
La documentation indique que la version courte de cet argument est -mld. Essayons :
cmds.displayPref(mld='immediate')
# Error: Invalid flag 'mld'
# Traceback (most recent call last):
# File "<maya console>", line 2, in <module>
# TypeError: Invalid flag 'mld' #
Mince…
Dans le doute, faites un help sur la commande :
cmds.help('displayPref')
# Result:
Synopsis: displayPref [flags]
Flags:
-q -query
-aop -activeObjectPivots on|off
-da -displayAffected on|off
-dfs -defaultFontSize Int
-dgr -displayGradient on|off
-fm -fontSettingMode Int
-gf -ghostFrames Int Int Int
-lw -lineWidth Float
-mhr -maxHardwareTextureResolution
-mlm -materialLoadingMode String << Ici!
-mtr -maxTextureResolution Int
-pet -purgeExistingTextures
-roe -regionOfEffect on|off
-sfs -smallFontSize Int
-st -shadeTemplates on|off
-tdp -textureDrawPixel on|off
-wsa -wireframeOnShadedActive String
Comme vous pouvez le voir, ce n’est pas -mld, mais -mlm qu’il faut utiliser. La documentation est fausse…
cmds.displayPref(mlm='immediate')
Et voilà !
Conclusion
Qu’est-ce que vous faites encore là ? Vos animateurs souffrent, leurs playblasts ont besoin de vous !
Merci à Paul-Émile pour le tuyau. :dentcasse:
Commentaires
Mince quand tu as enfin la solution a un probleme 6 ans plus tard xd
J'avais fini par faire mon propre playblast a coup de screenshot du viewport afin de loader toutes les textures chaque frame.....
Merci pour le partage !