Optimieren von HLSL-Shadern
In diesem Abschnitt werden allgemeine Strategien beschrieben, mit denen Sie Ihre Shader optimieren können. Sie können diese Strategien auf Shader anwenden, die in jeder Sprache und auf jeder Plattform geschrieben sind.
- Wissen, wo Shaderberechnungen ausgeführt werden sollen
- Unnötige Anweisungen überspringen
- Packvariablen und Interpolanten
- Reduzieren der Komplexität von Shadern
- Verwandte Themen
- Zugehörige Themen
Wissen, wo Shaderberechnungen ausgeführt werden sollen
Vertex-Shader führen Vorgänge aus, die das Abrufen von Scheitelpunkten und die Matrixtransformation von Vertexdaten umfassen. In der Regel werden Vertex-Shader einmal pro Scheitelpunkt ausgeführt.
Pixel-Shader führen Vorgänge aus, die das Abrufen von Texturdaten und das Ausführen von Beleuchtungsberechnungen umfassen. In der Regel werden Pixel-Shader einmal pro Pixel für eine bestimmte Geometrie ausgeführt.
In der Regel überwies Pixel scheitelpunkte in einer Szene, sodass Pixel-Shader häufiger ausgeführt werden als Vertex-Shader.
Beachten Sie beim Entwerfen von Shaderalgorithmen Folgendes:
- Führen Sie nach Möglichkeit Berechnungen für den Vertex-Shader aus. Eine Berechnung, die für einen Pixel-Shader ausgeführt wird, ist viel teurer als eine Berechnung, die für einen Vertex-Shader ausgeführt wird.
- Erwägen Sie die Verwendung von Vertexberechnungen, um die Leistung in Situationen wie dichten Netzen zu verbessern. Bei dichten Gittern können Berechnungen per Vertex Ergebnisse erzeugen, die visuell nicht von Ergebnissen zu unterscheiden sind, die mit Berechnungen pro Pixel erzeugt werden.
Unnötige Anweisungen überspringen
In HLSL bietet dynamische Verzweigung die Möglichkeit, die Anzahl der ausgeführten Anweisungen zu begrenzen. Daher kann dynamische Verzweigung dazu beitragen, die Ausführungszeit des Shaders zu beschleunigen. Wenn keine Geometrie oder Pixel angezeigt werden, verwenden Sie dynamische Verzweigung, um den Shader zu beenden oder Anweisungen einzuschränken. Wenn beispielsweise ein Pixel nicht leuchtet, hat es keinen Sinn, den Beleuchtungsalgorithmus auszuführen.
In der folgenden Tabelle sind einige Fälle aufgeführt, in denen Sie Bedingungen in Ihrem Shader testen und dynamische Verzweigungen verwenden können, um unnötige Anweisungen zu überspringen. Die Tabelle ist nicht umfassend. Vielmehr soll es Ihnen Ideen zur Optimierung Ihres Codes geben.
Zu überprüfende Bedingung | Antwort im Shader |
---|---|
Die Alphaprüfung stellt fest, dass ein Pixel nicht angezeigt wird. | Überspringen Sie den Rest des Shaders. |
Das Pixel oder die Geometrie ist vollständig beschlagen. | Überspringen Sie den Rest des Shaders. |
Die Hautgewichtung ist 0. | Knochen überspringen. |
Die Lichtdämpfung ist 0. | Beleuchtung überspringen. |
Nicht positiver lambertianischer Begriff. | Beleuchtung überspringen. |
Packvariablen und Interpolanten
Beachten Sie den für Shaderdaten erforderlichen Speicherplatz. Packen Sie so viele Informationen wie möglich in eine Variable oder interpolant. Manchmal können die Informationen aus zwei Variablen in den Speicherplatz einer einzelnen Variablen gepackt werden.
Reduzieren der Komplexität von Shadern
Halten Sie Ihre Shader klein und einfach. Im Allgemeinen werden Shader mit weniger Anweisungen schneller ausgeführt als Shader mit mehr Anweisungen. Es ist auch einfacher, kleinere, weniger komplexe Shader zu debuggen und zu optimieren.
Verwandte Themen
Zugehörige Themen