Share via


Pixel-Shaderphase

Die Pixel-Shader-Phase (PS) ermöglicht umfassende Schattierungstechniken wie Die Beleuchtung pro Pixel und die Nachbearbeitung. Ein Pixel-Shader ist ein Programm, das konstante Variablen, Texturdaten, interpolierte Werte pro Vertex und andere Daten kombiniert, um Ausgaben pro Pixel zu erzeugen. Die Rasterisierungsphase ruft einen Pixel-Shader einmal für jedes Pixel auf, das von einem Primitiven abgedeckt wird. Es ist jedoch möglich, einen NULL-Shader anzugeben, um das Ausführen eines Shaders zu vermeiden.

Der Pixel-Shader

Beim Multisampling einer Textur wird einmal ein Pixel-Shader pro abgedecktem Pixel aufgerufen, während für jede abgedeckte Multisampel ein Tiefen-/Schablonentest durchgeführt wird. Beispiele, die den Tiefen-/Schablonentest bestehen, werden mit der Ausgabefarbe des Pixel-Shaders aktualisiert.

Die intrinsischen Funktionen des Pixel-Shaders erzeugen oder verwenden Ableitungen von Mengen in Bezug auf den Bildschirmraum x und y. Die am häufigsten verwendete Verwendung für Ableitungen ist das Berechnen von Level-of-Detail-Berechnungen für texturierte Stichprobenentnahmen und im Fall der anisotropen Filterung die Auswahl von Proben entlang der Achse der Anisotropie. In der Regel führt eine Hardwareimplementierung einen Pixel-Shader auf mehreren Pixeln (z. B. einem 2x2-Raster) gleichzeitig aus, sodass Ableitungen von Mengen, die im Pixel-Shader berechnet werden, als Deltas der Werte am gleichen Ausführungspunkt in benachbarten Pixeln relativ angenähert werden können.

Eingaben

Wenn die Pipeline ohne Geometrie-Shader konfiguriert ist, ist ein Pixel-Shader auf 16-, 32-Bit- und 4-Komponenten-Eingaben beschränkt. Andernfalls kann ein Pixel-Shader bis zu 32-, 32-Bit- und 4-Komponenten-Eingaben aufnehmen.

Pixel-Shader-Eingabedaten enthalten Vertexattribute (die mit oder ohne Perspektivkorrektur interpoliert werden können) oder können als primitive Konstanten behandelt werden. Pixel-Shadereingaben werden aus den Vertexattributen des Grundtyps interpoliert, der gerastert wird, basierend auf dem deklarierten Interpolationsmodus. Wenn ein Primitive vor der Rasterung abgeschnitten wird, wird der Interpolationsmodus auch während des Abschneidevorgangs berücksichtigt.

Vertexattribute werden an Pixel-Shader-Centerstandorten interpoliert (oder ausgewertet). Die Interpolationsmodi für Pixel-Shaderattribute werden in einer Eingaberegisterdeklaration pro Element in einem Argument oder einer Eingabestruktur deklariert. Attribute können linear oder mit zentrierter Stichprobenentnahme interpoliert werden. Die Zenzentrierungsauswertung ist nur beim Multisampling relevant, um Fälle abzudecken, in denen ein Pixel von einem Primitiven bedeckt ist, ein Pixelzentrum jedoch möglicherweise nicht ist. Die zentrielle Auswertung erfolgt so nah wie möglich am (nicht abgedeckten) Pixelpunkt.

Eingaben können auch mit einer Systemwertsemantik deklariert werden, die einen Parameter markiert, der von anderen Pipelinephasen verwendet wird. Für instance sollte eine Pixelposition mit der SV_Position Semantik gekennzeichnet werden. Die IA-Phase kann einen Skalar für einen Pixel-Shader erzeugen (mit SV_PrimitiveID). Die Rasterisierphase kann auch einen Skalar für einen Pixelshader generieren (mit SV_IsFrontFace).

Ausgaben

Ein Pixel-Shader kann bis zu 8-, 32-Bit-, 4-Komponenten-Farben oder keine Farbe ausgeben, wenn das Pixel verworfen wird. Pixel-Shaderausgaberegisterkomponenten müssen deklariert werden, bevor sie verwendet werden können. für jedes Register ist eine separate Ausgabe-Schreib-Maske zulässig.

Verwenden Sie den Zustand depth-write-enable (in der Ausgabe-Merger-Phase), um zu steuern, ob Tiefendaten in einen Tiefenpuffer geschrieben werden (oder verwenden Sie die Verwerfen-Anweisung, um Daten für dieses Pixel zu verwerfen). Ein Pixel-Shader kann auch einen optionalen 32-Bit-, 1-Komponenten-, Gleitkomma- und Tiefenwert für Tiefentests ausgeben (unter Verwendung der SV_Depth Semantik). Der Tiefenwert wird im oDepth-Register ausgegeben und ersetzt den interpolierten Tiefenwert für Tiefentests (vorausgesetzt, die Tiefenprüfung ist aktiviert). Es gibt keine Möglichkeit, dynamisch zwischen der Verwendung von Fixed-Function Depth oder Shader oDepth zu wechseln.

Ein Pixel-Shader kann keinen Schablonenwert ausgeben.

Grafikpipeline

Pipelinephasen (Direct3D 10)