Exemplarische Vorgehensweise: Debuggen von Renderingfehlern, die durch Schattierungen entstanden sind
In dieser exemplarischen Vorgehensweise wird erläutert, wie die Grafikdiagnose von Visual Studio zur Untersuchung eines Objekts verwendet wird, das aufgrund eines Shader-Bugs den falschen Farbton hat.
Dieses Beispiel demonstriert, wie Sie
Überprüfen Sie die Grafikprotokollen Dokument, um Pixel zu identifizieren, die das Problem zeigen.
das Fenster Grafikpixelverlauf verwenden, um den Pixelzustand genauer zu untersuchen.
den HLSL-Debugger verwenden, um das Pixel und die Vertex-Shader zu überprüfen.
Szenario
Ein falscher Farbton für Objekte tritt häufig auf, wenn ein Vertex-Shader einem Pixel-Shader falsche oder unvollständige Informationen übergibt.
In diesem Szenario haben Sie vor Kurzem ein Objekt zur App hinzugefügt, zusammen mit neuen Vertex- und Pixel-Shadern, um das Objekt zu transformieren und ihm ein einzigartiges Aussehen zu verleihen. Wenn Sie die Anwendung während eines Tests ausführen, wird das Objekt einfarbig schwarz gerendert. Mit der Grafikdiagnose können Sie den Fehler in einer Grafikprotokolldatei erfassen, um die App zu debuggen. Das Problem sieht in der App wie folgt aus:
Untersuchung
Mithilfe der Grafikdiagnosentools verwenden, können Sie das Grafikprotokoll laden protokollieren Dokument, um die Frames zu überprüfen, die während des Tests aufgezeichnet wurden.
So überprüfen Sie einen Frame in einem Grafikprotokoll
Laden Sie in Visual Studio ein Grafikprotokoll, das einen Frame mit dem fehlenden Modell enthält. Ein neues Grafikprotokolldokumentfenster wird in Visual Studio angezeigt. Geben Sie im obersten Abschnitt des Fensters befindet sich die Renderingzielausgabe des ausgewählten Frames. Im unteren Teil befindet sich die Frameliste, in der alle aufgezeichneten Frames als Miniaturansicht angezeigt werden.
Wählen Sie in der Frameliste einen Frame aus, in dem das Objekt nicht richtig dargestellt wird. Das Renderingziel wird aktualisiert, um den ausgewählten Frame wiederzugeben. In diesem Szenario sieht das Grafikprotokolldokumentfenster wie folgt aus:
Nachdem Sie einen Frame ausgewählt haben, der den Fehler zeigt, können Sie den Grafikpixelverlauf verwenden, um den Fehler zu diagnostizieren. Das Fenster Grafikpixelverlauf zeigt die Primitive an, die möglicherweise Auswirkungen auf ein bestimmtes Pixel hatten, sowie ihre Shader und ihre Auswirkungen auf das Renderingziel (in zeitlicher Reihenfolge).
So überprüfen Sie ein Pixel
Öffnen Sie das Fenster Grafikpixelverlauf. Klicken Sie auf der Symbolleiste Grafikdiagnose auf Pixelverlauf.
Wählen Sie ein Pixel aus, um es zu überprüfen. Auf den Grafikprotokollen Sie Dokumentfenster, auswählen eines der Pixel des Objekts, das den falschen Farbton aufweist:
Das Fenster Grafikpixelverlauf wird aktualisiert, um das ausgewählte Pixel wiederzugeben. In diesem Szenario sieht das Fenster Grafikpixelverlauf wie folgt aus:
Sie sehen, dass das Ergebnis des Pixel-Shaders vollständig deckendes Schwarz ist (0, 0, 0, 1) und dass die Ausgabezusammenführung dieses mit der vorherigen Farbe des Pixels kombiniert, sodass das Ergebnis ebenfalls vollständig deckend schwarz ist.
Nachdem Sie ein Pixel mit falschem Farbton überprüft haben und feststellen, dass die Ausgabe des Pixel-Shaders nicht die erwartete Farbe aufweist, können Sie den Pixel-Shader mithilfe des HLSL-Debuggers untersuchen und herausfinden, was mit der Farbe des Objekts geschehen ist. Sie können den HLSL-Debugger verwenden, um den Zustand von HLSL-Variablen während der Ausführung zu untersuchen, den HLSL-Code schrittweise zu überprüfen und Haltepunkte festzulegen, die Ihnen bei der Problemdiagnose helfen.
So überprüfen Sie den Pixel-Shader
Beginnen Sie mit dem Debugging des Pixel-Shaders. Wählen Sie im Fenster Grafikpixelverlauf unter dem Primitiv des Objekts neben Pixel-Shader die Schaltfläche Debuggen starten aus.
Da der Pixel-Shader die Farbe einfach vom Vertex-Shader durchgibt, lässt sich in diesem Szenario sehr gut beobachten, dass der Pixel-Shader nicht die Ursache des Problems ist.
Halten Sie den Mauszeiger über input.color. Beachten Sie, dass der Wert vollständig deckendes Schwarz ist (0, 0, 0, 1).
In diesem Szenario ergibt die Untersuchung, dass die falsche Farbe wahrscheinlich das Ergebnis eines Vertex-Shaders ist, der nicht der rechten Farbinformationen bereitstellt, mit denen der Pixel-Shader arbeiten kann.
Nachdem Sie festgestellt haben, dass der Vertex-Shader wahrscheinlich die rechten Informationen nicht an den Pixel-Shader übergibt, ist der nächste Schritt darin, den Vertex-Shader überprüfen.
So überprüfen Sie den Vertex-Shader
Beginnen Sie mit dem Debugging des Vertex-Shaders. Wählen Sie im Fenster Grafikpixelverlauf unter dem Primitiv des Objekts neben Vertex-Shader die Schaltfläche Debuggen starten aus.
Suchen Sie die Ausgabestruktur des Vertex-Shaders; dies ist die Eingabe für den Pixel-Shader. In diesem Szenario lautet der Name dieser Struktur output. Überprüfen Sie den Code des Vertex-Shaders Sie, dass der Member color der Struktur output explizit auf vollständig deckendes Schwarz festgelegt wurde, wegen jemand Debuggingsaufwände.
Überprüfen Sie, ob das Farbenmember nie von der Eingabestruktur kopiert wird. Da der Wert von output.color auf vollständig deckendes Schwarz festgelegt wird, bevor die output-Struktur zurückgegeben wird, empfiehlt es sich, zu überprüfen, ob der Wert von output nicht richtig auf einer vorherigen Zeile initialisiert wurde. Schritt durch den Code des Vertex-Shaders, bis die Zeile gelangen, die output.color festlegt, um zu überwachen, während Sie den Wert von output.color überwachen. Beachten Sie, dass der Wert von output.color nicht initialisiert wurde, bis er auf Schwarz festgelegt ist. Dies kennzeichnet, dass die Codezeile, die output.color auf Schwarz festgelegt wird, geändert werden soll, nicht gelöscht.
Nachdem Sie festgestellt, dass die Ursache des Renderingproblems daran liegt, dass der Vertex-Shader den richtigen Farbwert nicht den Pixel-Shader übergibt, können diese Informationen verwenden, um das Problem zu beheben. In diesem Szenario können Sie sie korrigieren, indem Sie den folgenden Code im Vertex-Shader ändern
output.color = float3(0.0f, 0.0f, 0.0f);
auf
output.color = input.color;
Dieser Code reicht nur die Vertexfarbe von den unveränderten Vertices des Objekts durch; komplexere Vertex-Shader könnten die Farbe ändern, bevor sie übergeben wird. Der korrigierte Code des Vertex-Shader sollte wie folgt aussehen:
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.