Pixelshaderphase (PS)
Die Pixelshaderphase (PS) empfängt interpolierte Daten für einen Grundtyp und generiert pro Pixel daten wie Farbe.
Dies ist eine programmierbare Shaderphase; sie wird als abgerundeter Block im Grafikpipelinediagramm angezeigt. Diese Shaderphase macht ihre eigene einzigartige Funktionalität verfügbar, die auf dem Common-Shader-Kern 4.0 des Shadermodells 4.0 basiert.
Die Pixelshaderphase (PS) ermöglicht umfangreiche Schattierungstechniken wie Beleuchtung pro Pixel und Nachbearbeitung. Ein Pixelshader ist ein Programm, das Konstantenvariablen, Texturdaten, interpolierte Pro-Vertex-Werte und andere Daten kombiniert, um Pro-Pixel-Ausgaben zu erzeugen. Die Rasterizerphase (RS) ruft einen Pixelshader einmal für jedes Pixel auf, das von einem Grundtyp abgedeckt wird. Es ist jedoch möglich, einen NULL-Shader anzugeben, um das Ausführen eines Shaders zu vermeiden.
Beim Multisampling einer Textur wird ein Pixelshader einmal pro abgedecktem Pixel aufgerufen, während für jedes abgedeckte Multisample ein Tiefen-/Schablonentest durchgeführt wird. Beispiele, die den Tiefen-/Schablonentest bestehen, werden mit der Ausgabefarbe des Pixelshaders aktualisiert.
Die systeminternen Pixelshaderfunktionen erzeugen oder verwenden Derivate von Mengen im Hinblick auf den Bildschirmbereich x und y. Die häufigste Verwendung für Ableitungen ist die Berechnung von Detailberechnungen für texturbasierte Samplings und bei anisotropischer Filterung, auswählen von Proben entlang der Achse der Anisotropie. In der Regel führt eine Hardwareimplementierung einen Pixelshader auf mehreren Pixeln (z. B. ein 2x2-Raster) gleichzeitig aus, sodass Derivate von Mengen, die im Pixelshader berechnet werden, relativ ungefähr als Deltas der Werte am gleichen Ausführungspunkt in benachbarten Pixeln sein können.
Eingänge
Wenn die Pipeline ohne Geometrie-Shader konfiguriert ist, ist ein Pixelshader auf 16, 32-Bit-, 4-Komponenten-Eingaben beschränkt. Andernfalls kann ein Pixelshader bis zu 32, 32-Bit- und 4-Komponenteneingaben dauern.
Pixel-Shadereingabedaten enthalten Vertexattribute (die mit oder ohne Perspektivkorrektur interpoliert werden können) oder als Grundtypkonstanten behandelt werden können. Pixel-Shadereingaben werden basierend auf dem deklarierten Interpolationsmodus aus den Vertexattributen des Grundtyps interpoliert. Wenn ein Grundtyp vor der Rasterung abgeschnitten wird, wird auch der Interpolationsmodus während des Clippingprozesses berücksichtigt.
Vertexattribute werden an Pixel-Shader-Center-Speicherorten interpoliert (oder ausgewertet). Die Interpolationsmodi des Pixelshader-Attributs werden in einer Eingaberegisterdeklaration pro Element entweder in einem Argument oder einer Eingabestruktur deklariert. Attribute können linear oder mit Schwerpunktsampling interpoliert werden. Siehe abschnitt "Centroid Sampling of Attributes when Multisample Antialiasing" in Rasterization rules. Die Schwerpunktauswertung ist nur während des Multisamplings relevant, um Fälle abzudecken, in denen ein Pixel von einem Grundtyp abgedeckt wird, aber möglicherweise kein Pixelmittelpunkt ist; Die Schwerpunktauswertung erfolgt so nah wie möglich an der (nicht abgedeckten) Pixelmitte.
Eingaben können auch mit einer Systemwertsemantik deklariert werden, die einen Parameter kennzeichnet, der von anderen Pipelinephasen genutzt wird. Beispielsweise sollte eine Pixelposition mit der SV_Position Semantik markiert werden. Die Eingabeassemblerphase (Input Assembler, IA) kann einen Skalar für einen Pixelshader (mithilfe von SV_PrimitiveID) erzeugen. Die Rasterizerphase (RS) kann auch einen Skalar für einen Pixelshader (mit SV_IsFrontFace) generieren.
Ausgaben
Ein Pixelshader kann bis zu 8, 32-Bit-, 4-Komponenten-Farben oder keine Farbe ausgeben, wenn das Pixel verworfen wird. Die Komponenten des Pixelshader-Ausgaberegisters müssen deklariert werden, bevor sie verwendet werden können. jedes Register ist eine unterschiedliche Ausgabeschreibmaske zulässig.
Verwenden Sie den Tiefenschreibzustand (in der Ausgabezusammenführungsphase (OM)), um zu steuern, ob Tiefendaten in einen Tiefenpuffer geschrieben werden (oder die Verwerfen-Anweisung verwenden, um Daten für dieses Pixel zu verwerfen). Ein Pixelshader kann auch einen optionalen 32-Bit-, 1-Komponenten-, Gleitkomma-, Tiefenwert für Tiefentests ausgeben (mithilfe der SV_Depth Semantik). Der Tiefenwert wird im oDepth-Register ausgegeben und ersetzt den interpolierten Tiefenwert für Tiefentests (vorausgesetzt, tiefentests sind aktiviert). Es gibt keine Möglichkeit, sich dynamisch zwischen verwendung der Tiefen- oder Shader-ODepth mit fester Funktion zu ändern.
Ein Pixelshader kann keinen Schablonenwert ausgeben.
Verwandte Themen