HLSL-Debugger
Mit dem HLSL-Debugger, der eines der Grafikdiagnosetools in Visual Studio können Sie erkennen, wie der HLSL-Shader-Code mit Grafikdaten funktioniert, die während einer Grafikdiagnose-Erfassungssitzung aufgezeichnet wurden.
Dies ist der HLSL-Debugger:
Grundlegendes zum HLSL-Debugger
Der HLSL-Debugger kann Ihnen helfen, Probleme zu verstehen, die im Shader-Code auftreten. Das Debuggen von HLSL-Code in Visual Studio ähnelt dem Debuggen von Code, der in anderen Sprachen wie C++, C# oder Visual Basic geschrieben wird. Sie können den Inhalt von Variablen überprüfen, Haltepunkte festlegen, den Code durchlaufen und die Aufrufliste abarbeiten, so wie Sie es auch beim Debuggen anderer Sprachen können.
Da GPUs jedoch durch gleichzeitiges Ausführen von Shader-Codes auf Hunderten von Threads eine hohe Leistungsfähigkeit erreichen, wurde der HLSL-Debugger so entworfen, dass er gemeinsam mit anderen Grafikdiagnosetools verwendet werden kann, um alle Informationen auf sinnvolle Art und Weise zu präsentieren. Die Grafikdiagnose erstellt aufgezeichnete Frames mithilfe der in Grafikprotokollen aufgezeichneten Informationen neu. Der HLSL-Debugger überwacht die GPU-Ausführung beim Ausführen des Shader-Codes nicht in Echtzeit. Da ein Grafikprotokoll genügend Informationen enthält, um einen beliebigen Teil der Ausgabe neu zu erstellen, und da die Grafikdiagnose Tools bereitstellt, die Ihnen helfen können, das genaue Pixel und das Ereignis festzulegen, in dem ein Fehler auftritt, muss der HLSL-Debugger den genauen Shaderthread nur simulieren, der Sie interessiert. Dies bedeutet, dass die Arbeit des Shaders für die CPU simuliert werden kann, in der die internen Funktionen in der Vollansicht angezeigt werden. Aus diesem Grund bietet der HLSL-Debugger eine CPU-ähnliche Debugleistung.
Allerdings unterliegt der HLSL-Debugger gerade folgenden Einschränkungen:
Es ist nicht möglich, eine Anwendung und ihren Shader-Code gleichzeitig zu debuggen. Sie können jedoch zwischen beiden wechseln.
Sie können dem Überwachungsfenster Variablen und Register hinzufügen, aber Ausdrücke werden nicht unterstützt.
Dennoch stellt der HLSL-Debugger eine bessere, CPU-ähnlichere Debugleistung zur Verfügung, als andernfalls möglich wäre.
HLSL-Shader bearbeiten und anwenden
Der HLSL-Shader-Debugger unterstützt "Bearbeiten und Fortfahren" nicht auf die gleiche Weise wie der CPU-Debugger, da das GPU-Ausführungsmodell keine Umkehrung des Shader-Zustands ermöglicht. Stattdessen unterstützt der HLSL-Debugger das Bearbeiten und Anwenden, mit dem Sie HLSL-Quelldateien bearbeiten und dann Übernehmen wählen können, um den Frame zu regenerieren und die Auswirkungen Ihrer Änderungen zu sehen. Ihr geänderter Shader-Code befindet sich in einer separaten Datei, um die Integrität der ursprünglichen HLSL-Quelldatei des Projekts beizubehalten, aber wenn Sie mit den Änderungen zufrieden sind können Sie Kopieren in... wählen, um die Änderungen in Ihr Projekt zu kopieren. Mit dieser Funktion können Sie den Shader-Code, der Fehler enthält, schnell durchlaufen und kostspielige Wiederherstellungs- und Erfassungsschritte aus Ihrem Workflow HLSL debuggen beseitigen.
Wichtig
Der geänderte Shader gilt nicht für die Frame-Analyse.
HLSL-Disassembly
Der HLSL-Shader-Debugger enthält eine Liste der HLSL-Shader-Assembly rechts neben der Auflistung des HLSL-Quellcodes.
Debuggen von HLSL-Code
Sie können auf den HLSL-Debugger im Fenster Grafikpipelinestufen oder Grafikpixelverlauf zugreifen.
So starten Sie den HLSL-Debugger im Fenster "Grafikpipelinestufen"
Im Fenster Grafikpipelinestufen suchen Sie die Pipelinestufe, die dem Shader zugeordnet ist, den Sie debuggen möchten.
Unterhalb des Titels der Pipelinestufe wählen Sie Debuggen starten, was als kleiner grüner Pfeil angezeigt wird.
Hinweis
Dieser Einstiegspunkt in den HLSL-Debugger debuggt nur den ersten Shader-Thread für die entsprechende Stufe, d. h. für den ersten Vertex oder das erste Pixel, der bzw. das verarbeitet wird.Sie können Grafikpixelverlauf verwenden, um auf andere Threads dieser Shader-Stufen zuzugreifen.
So starten Sie den HLSL-Debugger im Fenster "Grafikpixelverlauf"
Erweitern Sie in Grafikpixelverlauf den Zeichnen-Befehl, die dem Shader zugeordnet ist, den Sie debuggen möchten. Jeder Zeichnen-Befehl kann mehreren Primitiva entsprechen.
Erweitern Sie in den Eigenschaften des Zeichnen-Befehls das Primitivum, dessen resultierender Farbbeitrag auf einen Fehler im Shadercode hindeutet. Wenn für mehrere Primitiva ein Fehler zu vermuten ist, wählen Sie davon das erste Primitivum aus, um eine Häufung von Fehlern zu vermeiden, durch die eine Diagnose des Problems schwieriger wird.
In den Eigenschaften des Primitivums wählen Sie aus, ob Sie Vertex-Shader oder den Pixel-Shader debuggen möchten. Debuggen Sie den Vertex-Shader, wenn Sie vermuten, dass der Pixel-Shader fehlerfrei ist, aber einen falschen Farbbeitrag generiert, weil der Vertex-Shader ihm falsche Konstanten übergibt. Andernfalls debuggen Sie den Pixel-Shader.
Wählen Sie rechts vom ausgewählten Shader Debuggen starten, was als kleiner grüner Pfeil angezeigt wird.
Hinweis
Dieser Einstiegspunkt in den HLSL-Debugger debuggt entweder den Pixel-Shader-Thread, der dem ausgewählten Zeichnen-Befehl, Primitivum und Pixel entspricht, oder die Vertex-Shader-Threads, deren Ergebnisse durch den Zeichnen-Befehl, die Primitiva und Pixel interpoliert werden, die Sie ausgewählt haben.Für Vertex-Shader können Sie den Einstiegspunkt auf einen bestimmten Vertex festlegen, indem Sie die Details des Vertex-Shaders erweitern.
Beispiele dazu, wie Sie den HLSL-Debugger verwendet, um Shaderfehler zu debuggen, finden Sie unter Grafikdiagnosebeispiele oder in den exemplarischen Vorgehensweisen, auf die in dem Abschnitt mit verwandten Themen verlinkt wird.
Siehe auch
Aufgaben
Exemplarische Vorgehensweise: Fehlende Objekte durch Vertexschattierung
Exemplarische Vorgehensweise: Debuggen eines Compute-Shaders mithilfe der Grafikdiagnose