Procédure pas à pas : objets manquants en raison de l'état du périphérique
Cette procédure pas à pas montre comment utiliser Graphics Diagnostics Visual Studio pour examiner un objet qui manque en raison d'un état de périphérique qui n'est pas correctement configuré.
Cette procédure pas à pas montre comment :
Utilisez Liste des événements Graphics pour identifier les sources possibles du problème.
Utilisez la fenêtre Étapes de canalisation Graphics pour contrôler l'effet des appels d'API Direct3D DrawIndexed.
Utilisez la fenêtre Historique des pixels Graphics pour localiser le problème plus spécifiquement.
Examinez l'état de l'appareil pour déceler les problèmes potentiels ou les configurations incorrectes.
Scénario
L'une des raisons pour lesquelles les objets peuvent ne pas apparaître là où ils sont prévus dans une application 3D est une configuration incorrecte du périphérique de graphiques qui provoque l'exclusion des objets du rendu. Par exemple, lorsque la commande d'enroulement provoque l'élimination erronée des triangles ou lorsque la fonction de test de profondeur provoque le rejet de tous les pixels de l'objet.
Dans le scénario qui est décrit dans cette procédure pas à pas, vous venez d'atteindre la première étape importante du développement de votre application 3D et êtes prêt à la tester pour la première fois. Toutefois, lorsque vous exécutez l'application, seule l'interface utilisateur s'affiche à l'écran. À l'aide de l'outil Graphics Diagnostics, capturez le problème dans un fichier journal graphique afin de déboguer l'application. Dans l'application, le problème ressemble à cela :
Pour plus d'informations sur la façon de capturer des problèmes de graphiques dans le journal de graphiques, consultez le Capture d'informations Graphics.
Examen
À l'aide des outils Graphics Diagnostics, vous pouvez charger le fichier journal de graphiques pour examiner les frames qui ont été capturés pendant le test.
Pour examiner un frame dans un journal de graphiques
Dans Visual Studio, chargez un journal de graphiques qui contient un frame qui affiche le modèle manquant. Un nouvel onglet Graphics Diagnostics apparaît dans Visual Studio. La partie supérieure de cet onglet contient la sortie de cible de rendu du frame sélectionné. Dans la partie inférieure figure la Liste de frames, qui affiche chaque frame capturé sous forme d'une image miniature.
Dans Liste de frames, sélectionnez un frame qui indique que le modèle n'est pas affiché. La cible de rendu est mise à jour pour refléter le frame sélectionné. Dans ce scénario, l'onglet du journal des graphiques se présente comme suit :
Après avoir sélectionné un frame illustrant le problème, vous pouvez utiliser la fenêtre Liste des événements Graphics pour le diagnostiquer. La Liste des événements Graphics contient chaque appel d'API Direct3D qui a été effectué pour afficher le frame actif, par exemple, les appels API pour installer l'état du périphérique, créer et mettre à jour des mémoires tampons, et pour dessiner des objets qui apparaissent dans le frame. De nombreux genres d'appels sont intéressants car il y a généralement (mais pas toujours) une modification correspondante dans la cible de rendu lorsque l'application s'exécute comme prévu. Par exemple, les appels Draw, Dispatch, Copy ou Clear. Les appels de dessin sont particulièrement intéressants car chacun représente la géométrie que l'application affiche (les appels d'expédition peuvent également afficher la géométrie).
Pour vérifier que les appels de dessin sont exécutés
Ouvrez la fenêtre Liste des événements Graphics. Dans la barre d'outils Graphics Diagnostics, choisissez Liste des événements.
Examinez la Liste des événements Graphics pour les appels de dessin. Pour simplifier ce processus, entrez « Draw » dans la zone Rechercher dans l'angle supérieur droit de la fenêtre Liste des événements Graphics. La liste est filtrée, afin que les événements contenus comportent « draw » dans leurs titres. Dans ce scénario, vous découvrez que plusieurs appels de dessin ont été effectués :
Après avoir confirmé que les appels de dessin sont exécutés, vous pouvez déterminer celui qui correspond à la géométrie manquante. Comme vous savez que la géométrie manquante n'est pas tracée sur la cible de rendu (dans ce cas), vous pouvez utiliser la fenêtre Étapes de canalisation Graphics pour déterminer l'appel de dessin qui correspond à la géométrie manquante. La fenêtre Étapes de canalisation Graphics montre la géométrie qui a été envoyée à chaque appel de dessin, quel que soit son effet sur la cible de rendu. Lorsque vous naviguez dans les appels de dessin, les étapes de pipeline sont mises à jour pour afficher la géométrie associée à cet appel, et la sortie de la cible de rendu est mise à jour pour afficher l'état de la cible de rendu à l'issue de l'appel.
Pour rechercher l'appel de dessin pour la géométrie manquante
Ouvrez la fenêtre Étapes de canalisation Graphics. Dans la barre d'outils Graphics Diagnostics , choisissez Étapes de canalisation.
Parcourez chaque appel de dessin tout en examinant la fenêtre Étapes de canalisation Graphics pour le modèle manquant. L'étape Assembleur d'entrée affiche les données de modèle brutes. L'étape Vertex Shader affiche les données de modèle transformées. L'étape Pixel Shader montre la sortie du nuanceur de pixels. L'étape Fusion de sortie montre la cible de rendu fusionnée de cet appel de dessin et de tous les appels de dessin précédents.
Arrêtez lorsque vous avez atteint l'appel de dessin qui correspond au modèle manquant. Dans ce scénario, la fenêtre Étapes de canalisation Graphics indique que la géométrie a été restituée mais ne figure pas dans la cible de rendu :
Après avoir confirmé que l'application a restitué la géométrie manquante et localisé l'appel de dessin correspondant, vous pouvez sélectionner une partie de la sortie de la cible de rendu qui doit afficher la géométrie manquante, puis utiliser la fenêtre Historique des pixels Graphics pour déterminer la raison pour laquelle les pixels ont été exclus. L'historique des pixels contient une liste de chaque appel de dessin qui peut avoir eu un effet sur un pixel donné. Chaque appel de dessin de la fenêtre Historique des pixels Graphics est identifié par un nombre qui est également affiché dans la fenêtre Liste des événements Graphics. Cela vous permet de confirmer que le pixel doit afficher la géométrie manquante et de savoir pourquoi le pixel a été exclu
Pour déterminer pourquoi le pixel a été exclu
Ouvrez la fenêtre Historique des pixels Graphics. Dans la barre d'outils Graphics Diagnostics, choisissez Historique des pixels.
En fonction de l'aperçu Pixel Shader, sélectionnez un pixel dans la sortie de la mémoire de l'image qui doit contenir une partie de la géométrie manquante. Dans ce scénario, la sortie du nuanceur de pixels doit couvrir la majorité de la cible de rendu ; lorsqu'un pixel est sélectionné, la fenêtre Historique des pixels Graphics se présente comme suit :
Vérifiez que le pixel de la cible de rendu sélectionné contient une partie de la géométrie en mettant en correspondance le numéro de l'appel de dessin examiné (dans la fenêtre Liste des événements Graphics) avec l'un des appels de dessin dans la fenêtre Historique des pixels Graphics. Si aucun des appels de la fenêtre Historique des pixels Graphics ne correspond à l'appel de dessin que vous examinez, répétez ces étapes (sauf l'étape 1) jusqu'à ce que vous trouviez une correspondance. Dans ce scénario, l'appel de dessin correspondant se présente comme suit :
Lorsque vous identifiez une correspondance, développez l'appel de dessin correspondant dans la fenêtre Historique des pixels Graphics et vérifiez que le pixel a été exclu. Chaque appel de dessin de la fenêtre Historique des pixels Graphics correspond à une ou plusieurs primitives géométriques (points, lignes ou triangles) ayant croisé ce pixel et résultant de la géométrie de l'objet correspondant. Chacune de ces intersections peut fournir la couleur finale du pixel. Une primitive qui est exclue parce qu'elle n'a pas réussi le test Depth Test est représentée par une icône qui affiche la lettre Z sur une flèche descendante de gauche à droite.
Développez une primitive exclue pour mieux examiner l'état qui a causé son exclusion. Dans le groupe Fusion de sortie, déplacez le pointeur sur le Résultat. Une info-bulle indique la raison pour laquelle la primitive a été exclue. Dans ce scénario, l'examen révèle que la primitive a été exclue car elle n'a pas réussi le test de profondeur, et par conséquent n'a pas contribuer à la couleur finale du pixel.
Après avoir déterminé que la géométrie n'apparaît pas car ses primitives n'ont pas réussi le test Depth Test, vous pouvez supposer que ce problème est lié à un état de périphérique mal configuré. L'état du périphérique et d'autres données d'objet Direct3D peuvent être inspectés à l'aide de la Table des objets Graphics.
Pour examiner l'état du périphérique
Ouvrez la fenêtre Table des objets Graphics. Dans la barre d'outils Graphics Diagnostics, choisissez Table des objets.
Recherchez l'objet Périphérique D3D10 dans Table des objets Graphics, puis ouvrez l'objet Périphérique D3D10. Un nouvel onglet Périphérique d3d10 s'ouvre dans Visual Studio. Pour simplifier ce processus, vous pouvez trier la Table des objets Graphics par Type :
Examinez l'état de périphérique qui s'affiche dans l'onglet périphérique d3d10 pour y découvrir les problèmes potentiels. Comme la géométrie n'apparaît pas parce que ses primitives n'ont pas réussi le test Depth Test, vous pouvez vous concentrer sur l'état du périphérique, tel que le stencil de profondeur, qui affecte ce test. Dans ce scénario, la vue du stencil de profondeur (sous état de la fusion de sortie) contient une valeur rare du membre fonction de profondeur, D3D10_COMPARISON_GREATER :
Après avoir déterminé que le problème de rendu est lié à une fonction de profondeur mal configurée, vous pouvez utiliser ces informations ainsi que votre connaissance du code pour localiser l'emplacement où la fonction de profondeur a été mal définie, et résoudre le problème. Si vous êtes peu familier avec le code, vous pourriez rechercher le problème à l'aide des indices que vous avez rassemblés lors du débogage, par exemple, en fonction de la description du stencil de profondeur dans ce scénario, vous pouvez rechercher le code des mots tels que « profondeur » ou « SUPÉRIEUR ». Après avoir résolu le code, régénérez-le et réexécutez l'application pour vérifier que le problème de rendu est résolu :