Freigeben über


Exemplarische Vorgehensweise: Fehlende Objekte durch Gerätestatus

In dieser exemplarischen Vorgehensweise wird erläutert, wie die Visual Studio Grafikdiagnose zur Untersuchung eines Objekts verwendet wird, das aufgrund eines falsch konfigurierten Gerätezustands fehlt.

Dieses Beispiel demonstriert, wie Sie

  • Mit der Grafikereignisliste können Sie potenzielle Problemquellen ermitteln.

  • Im Fenster Grafikpipelinestufen können Sie die Auswirkung der DrawIndexed Direct3D-API-Aufrufe überprüfen.

  • Im Fenster Grafikpixelverlauf können Sie das Problem Fehler genauer lokalisieren.

  • Überprüfen Sie den Gerätezustand auf potenzielle Probleme oder Fehlkonfigurationen.

Szenario

Ein Grund dafür, dass Objekte nicht an der gewünschten Stelle in einer 3D-App angezeigt werden, ist die Fehlkonfiguration des Grafikgeräts, die dazu führt, dass die Objekte vom Rendern ausgeschlossen werden. Dies ist z. B. der Fall, wenn die Reihenfolge der Windung dazu führt, dass Dreiecke fälschlicherweise herausgefiltert werden, oder wenn die Tiefentestfunktion dazu führt, dass alle Pixel im Objekt abgelehnt werden.

In dem Szenario, das in dieser exemplarischen Vorgehensweise beschrieben wird, haben Sie gerade den ersten Meilenstein in der Entwicklung Ihrer 3D-App erreicht und möchten sie nun zum ersten Mal testen. Wenn Sie die App jedoch ausführen, wird nur die Benutzeroberfläche auf dem Bildschirm gerendert. Mit der Grafikdiagnose können Sie das Problem in einer Grafikprotokolldatei erfassen, um die App zu debuggen. Das Problem sieht in der App wie folgt aus:

Die Anwendung vor Behebung des Problems

Informationen zum Erfassen von Grafikproblemen in einem Grafikprotokoll finden Sie unter Erfassen von Grafikinformationen.

Untersuchung

Mithilfe des Grafikdiagnose-Tools können Sie die Grafikprotokolldatei laden, um die Frames zu überprüfen, die während des Tests aufgezeichnet wurden.

So überprüfen Sie einen Frame in einem Grafikprotokoll

  1. Laden Sie in Visual Studio ein Grafikprotokoll, das einen Frame mit dem fehlenden Modell enthält. Eine neue Grafikdiagnose-Registerkarte wird in Visual Studio angezeigt. Ganz oben auf dieser Registerkarte befindet sich die Renderingzielausgabe des ausgewählten Frames. Im unteren Teil befindet sich die Frameliste, in der alle aufgezeichneten Frames als Miniaturansicht angezeigt werden.

  2. Wählen Sie in der Frameliste einen Frame aus, in dem das Modell nicht angezeigt wird. Das Renderingziel wird aktualisiert, um den ausgewählten Frame wiederzugeben. In diesem Szenario sieht die Grafikprotokoll-Registerkarte wie folgt aus:

    .vsglog-Registerkarte - Framepuffer-Vorschau und Frameliste

Wenn Sie einen Frame ausgewählt haben, der das Problem demonstriert, können Sie die Grafikereignisliste verwenden, um das Problem zu diagnostizieren. Die Grafikereignisliste enthält alle Direct3D-API-Aufrufe, die zum Rendern des aktiven Frames erzeugt wurden, z. B. API-Aufrufe, zum Einrichten des Gerätezustands, zum Erstellen und Aktualisieren des Puffers und zum Zeichnen von Objekten, die im Frame angezeigt werden. Viele Arten von Aufrufen sind interessant, weil es häufig (jedoch nicht immer) eine entsprechende Änderung im Renderziel gibt, wenn die App wie gewünscht funktioniert, z. B. Aufrufe zum Zeichnen, Verteilen, Kopieren oder Löschen. Zeichnen-Aufrufe sind besonders interessant, da jeder einzelne Geometrie darstellt, die die App gerendert hat (Dispatch-Aufrufe können ebenfalls Geometrie rendern).

So stellen Sie sicher, dass Zeichnen-Aufrufe ausgelöst wurden

  1. Öffnen Sie das Fenster Grafikereignisliste. Wählen Sie auf der Symbolleiste Grafikdiagnose die Option Ereignisliste aus.

  2. Überprüfen Sie die Grafikereignisliste auf Zeichnen-Aufrufe. Zur Erleichterung können Sie im Feld Suche in der oberen rechten Ecke des Fensters Grafikereignisliste "Zeichnen" eingeben. Damit wird die Liste gefiltert und enthält nur Ereignisse, die "Zeichnen" im Titel haben. In diesem Szenario erkennen Sie, dass mehrere Zeichnen-Aufrufe ausgelöst wurden:

    Grafikereignisliste mit erfassten Ereignissen

Wenn Sie bestätigt haben, dass Zeichnen-Aufrufe ausgelöst wurden, können Sie festlegen, welcher Aufruf der fehlenden Geometrie entspricht. Da Sie wissen, dass die fehlende Geometrie (in diesem Fall) nicht in das Renderziel gezeichnet wurde, können Sie im Fenster Grafikpipelinestufen festlegen, welcher Zeichnen-Aufruf der fehlenden Geometrie entspricht. Im Fenster Grafikpipelinestufen wird die Geometrie angezeigt, die an die einzelnen Zeichnen-Aufrufe gesendet wurde, unabhängig von der Auswirkung auf das Renderziel. Wenn Sie sich durch die Zeichnen-Aufrufe bewegen, werden die Pipelinestufen aktualisiert und zeigen die Geometrie an, die dem jeweiligen Aufruf zugeordnet ist. Die Ausgabe des Renderziels wird aktualisiert und zeigt den Zustand des Renderziels nach Ausführung des Aufrufs an.

So finden Sie den Zeichnen-Aufruf für die fehlende Geometrie

  1. Öffnen Sie das Fenster Grafikpipelinestufen. Wählen Sie auf der Symbolleiste Grafikdiagnose die Option Pipelinestufen aus.

  2. Bewegen Sie sich durch die einzelnen Zeichnen-Aufrufe, und durchsuchen Sie das Fenster Grafikpipelinestufen nach dem fehlenden Modell. Die Stufe Eingabe-Assembler zeigt die Rohdaten des Modells an. Die Stufe Vertex-Shader zeigt die transformierten Modelldaten an. Die Stufe Pixel-Shader zeigt die Ausgabe des Pixel-Shaders an. Die Stufe Ausgabezusammenführung zeigt das zusammengeführte Renderziel dieses Zeichnen-Aufrufs und der vorherigen Zeichnen-Aufrufe an.

  3. Halten Sie an, wenn Sie den Zeichnen-Aufruf erreicht haben, der dem fehlenden Modell entspricht. In diesem Szenario zeigt das Fenster Grafikpipelinestufen die Geometrie an, die gerendert wurde, aber nicht im Renderziel angezeigt wurde:

    Pipeline-Viewer mit dem fehlenden Objekt

Wenn Sie bestätigt haben, dass die App die fehlende Geometrie gerendert hat, und wenn Sie den entsprechenden Zeichnen-Aufruf gefunden haben, können Sie einen Teil der Ausgabe des Renderziels auswählen, der die fehlende Geometrie anzeigen sollte, und anschließend im Fenster Grafikpixelverlauf herausfinden, warum die Pixel ausgeschlossen wurden. Der Pixelverlauf enthält eine Liste aller Zeichnen-Aufrufen, die eine Auswirklung auf ein bestimmtes Pixel haben könnten. Jeder Zeichnen-Aufruf im Fenster Grafikpixelverlauf ist durch eine Zahl gekennzeichnet, die ebenfalls im Fenster Grafikereignisliste angezeigt wird. Anhand dieser Zahl können Sie bestätigen, dass das Pixel die fehlende Geometrie anzeigen soll, und herausfinden, warum das Pixel ausgeschlossen wurde.

So bestimmen Sie, warum das Pixel ausgeschlossen wurde

  1. Öffnen Sie das Fenster Grafikpixelverlauf. Klicken Sie auf der Symbolleiste Grafikdiagnose auf Pixelverlauf.

  2. Wählen Sie in der Pixel-Shader-Miniaturansicht ein Pixel in der Framepufferausgabe aus, das einen Teil der fehlenden Geometrie enthalten soll. In diesem Szenario muss die Ausgabe des Pixel-Shaders die meisten Renderziele abdecken. Wenn ein Pixel ausgewählt ist, sieht das Fenster Grafikpixelverlauf wie folgt aus:

    Pixelverlauffenster mit zugehörigen Zeichnen-Befehlen

  3. Bestätigen Sie, dass das ausgewählte Renderzielpixel einen Teil der Geometrie enthält, indem Sie für die Zahl des Zeichnen-Aufrufs, den Sie im Fenster Grafikereignisliste überprüfen, einen entsprechenden Zeichnen-Aufruf im Fenster Grafikpixelverlauf finden. Wenn kein Aufruf im Fenster Grafikpixelverlauf dem Zeichnen-Aufruf entspricht, den Sie überprüfen, wiederholen Sie diese Schritte (ohne Schritt 1), bis Sie eine Übereinstimmung finden. In diesem Szenario sieht der übereinstimmende Zeichnen-Aufruf wie folgt aus:

    Pixelverlauffenster mit Fragmentinformationen

  4. Wenn Sie eine Übereinstimmung gefunden haben, erweitern Sie den übereinstimmenden Zeichnen-Aufruf im Fenster Grafikpixelverlauf, und bestätigen Sie, dass das Pixel ausgeschlossen wurde. Jeder Zeichnen-Aufruf im Fenster Grafikpixelverlauf entspricht einem oder mehreren Geometrieprimitiven (Punkte, Linien oder Dreiecke), die dieses Pixel als Ergebnis der Geometrie des entsprechenden Objekt geschnitten haben. Jeder dieser Schnitte kann zur endgültigen Farbe des Pixels beitragen. Ein Primitiv, das ausgeschlossen wurde, weil es den Tiefentest nicht bestanden hat, wird durch ein Symbol dargestellt, das den Buchstaben Z über einem Pfeil enthält, der von links oben nach rechts unten geneigt ist.

  5. Erweitern Sie ein ausgeschlossenes Primitiv, um den Zustand, der zum Ausschluss geführt hat, weiter zu überprüfen. Bewegen Sie den Zeiger in der Gruppe Ausgabezusammenführung über das Ergebnis. Eine QuickInfo zeigt an, warum das Primitiv ausgeschlossen wurde. In diesem Szenario ergibt die Überprüfung, dass das Primitiv ausgeschlossen wurde, weil es den Tiefentest nicht bestanden hat und somit nicht zur endgültigen Farbe des Pixel beitragen konnte.

Wenn Sie erkannt haben, dass die Geometrie nicht angezeigt wird, weil die entsprechenden Primitive den Tiefentest nicht bestanden haben, können Sie davon ausgehen, dass dieses Problem im Zusammenhang mit einer Fehlkonfiguration des Gerätezustands steht. Gerätezustand und andere Direct3D-Objektdaten können mit der Grafikobjekttabelle überprüft werden.

So überprüfen Sie den Gerätezustand

  1. Öffnen Sie das Fenster Grafikobjekttabelle. Wählen Sie auf der Symbolleiste Grafikdiagnose die Option Objekttabelle aus.

  2. Suchen Sie das Objekt Gerät D3D10 in der Grafikobjekttabelle, und öffnen Sie dann das Objekt Geräte D3D10. Eine neue Registerkarte Gerät 3d10 wird in Visual Studio geöffnet. Sie können die Grafikobjekttabelle zur Erleichterung nach dem Typ sortieren:

    Grafikobjekttabelle und der zugehörige Gerätezustand

  3. Überprüfen Sie den Gerätezustand, der auf der Registerkarte Gerät d3d10 angezeigt wird, auf potenzielle Probleme. Da die Geometrie nicht angezeigt wird, weil die entsprechenden Primitive den Tiefentest nicht bestanden haben, können Sie sich auf einen Gerätezustand wie die Tiefenschablone konzentrieren, die den Tiefentest beeinflusst. In diesem Szenario enthält die Tiefenschablonenbeschreibung (unter Ausgabezusammenführungszustand) einen ungewöhnlichen Wert für das Mitglied Tiefenfunktion, D3D10_COMPARISON_GREATER:

    D3D10-Gerätefenster mit Informationen zur Tiefenschablone

Wenn Sie erkannt haben, dass der Grund für den Renderingfehler ein falsch konfigurierte Tiefenfunktion sein könnte, können Sie anhand dieser Informationen und Ihrer Kenntnis des Codes herausfinden, wo die Tiefenfunktion falsch eingestellt wurde, und das Problem dann beheben. Wenn Sie den Code kennen, können Sie das Problem anhand der Anhaltspunkte suchen, die Sie beim Debuggen gesammelt haben, z. B. können Sie anhand der Tiefenschablonenbeschreibung in diesem Szenario den Code nach Wörtern wie "depth" oder "GREATER" durchsuchen. Nachdem Sie den Code korrigiert haben, erstellen Sie ihn neu, und führen Sie die App erneut aus, um herauszufinden, ob das Renderingproblem behoben wurde.

App nach Behebung des Problems