Common-Shader Core

In ShaderModell 4 implementieren alle Shaderphasen die gleiche Basisfunktionalität mithilfe eines allgemeinen Shaderkerns. Darüber hinaus bieten jede der drei Shaderphasen (Vertex, Geometrie und Pixel) Funktionen, die für jede Stufe eindeutig sind, z. B. die Möglichkeit, neue Grundtypen aus der Geometrie-Shaderstufe zu generieren oder ein bestimmtes Pixel in der Pixel-Shaderstufe zu verwerfen. Im folgenden Diagramm wird gezeigt, wie Daten über eine Shaderstufe und die Beziehung des common-shader-Kerns mit Shaderspeicherressourcen fließen.

diagram of data flow in a shader stage

  • Eingabedaten: Ein Vertex-Shader empfängt seine Eingaben aus der Eingabeassemierphase; Geometrie- und Pixel-Shader erhalten ihre Eingaben aus der vorherigen Shaderstufe. Zusätzliche Eingaben umfassen systemwertige Semantik, die von der ersten Einheit in der Pipeline verwendet werden, auf die sie anwendbar sind.
  • Ausgabedaten: Shader generieren Ausgabeergebnisse, die an die nachfolgende Phase in der Pipeline übergeben werden. Für einen Geometrie-Shader kann die Menge der Datenausgabe aus einem einzelnen Aufruf variieren. Einige Ausgaben werden vom common-shader-Core (z. B. Vertexposition und Render-Target-Array-Index) interpretiert, andere werden von einer Anwendung interpretiert.
  • Shadercode: Shader können aus dem Arbeitsspeicher lesen, Vektor-Gleitkomma- und ganzzahlige Arithmetikvorgänge ausführen oder Flusssteuerungsvorgänge ausführen. Es gibt keinen Grenzwert für die Anzahl der Anweisungen, die in einem Shader implementiert werden können.
  • Sampler: Sampler definieren, wie Sie Texturen beispielen und filtern. So viele wie 16 Sampler können gleichzeitig an einen Shader gebunden werden.
  • Texturen: Texturen können mithilfe von Samplern gefiltert oder direkt mit der Ladefunktion gelesen werden.
  • Puffer: Puffer werden nie gefiltert, können aber direkt mit der Ladefunktion aus dem Arbeitsspeicher gelesen werden. So viele wie 128 Textur- und Pufferressourcen (kombiniert) können gleichzeitig an einen Shader gebunden werden.
  • Konstantenpuffer: Konstantenpuffer sind für Shaderkonstantenvariablen optimiert. So viele wie 16 Konstantenpuffer können gleichzeitig an eine Shaderstufe gebunden werden. Sie sind für häufigere Aktualisierungen aus der CPU ausgelegt; daher verfügen sie über zusätzliche Größe, Layout und Zugriffsbeschränkungen.

Unterschiede zwischen Direct3D 9 und Direct3D 10:

  • In Direct3D 9 hatte jede Shadereinheit eine einzelne, kleine Konstantenregisterdatei, um alle Konstanten-Shadervariablen zu speichern. Die Aufnahme aller Shader mit diesem begrenzten Konstantenraum erfordert häufiges Recycling von Konstanten durch die CPU.
  • In Direct3D 10 werden Konstanten in unveränderlichen Puffern im Arbeitsspeicher gespeichert und wie jede andere Ressource verwaltet. Es gibt keinen Grenzwert für die Anzahl der Konstantenpuffer, die eine Anwendung erstellen kann. Durch Die Organisation von Konstanten in Puffer nach Häufigkeit der Aktualisierung und Verwendung kann die Bandbreite, die zum Aktualisieren von Konstanten erforderlich ist, um alle Shader zu integrieren, erheblich reduziert werden.

Ganzzahl- und Bitweise-Unterstützung

Der allgemeine Shaderkern bietet einen vollständigen Satz von IEEE-kompatiblen 32-Bit-Ganzzahl- und Bitzeigervorgängen. Diese Vorgänge ermöglichen eine neue Klasse von Algorithmen in Grafikhardwarebeispielen: Komprimierungs- und Packtechniken, FFTs und Bitfield-Programmflusssteuerung.

Die Int - und Uint-Datentypen in Direct3D 10 HLSL weisen 32-Bit-Ganzzahlen in Hardware auf.

Unterschiede zwischen Direct3D 9 und Direct3D 10:
In Direct3D 9-Datenstromeingaben, die als ganze Zahl in HLSL gekennzeichnet sind, wurden als Gleitkomma interpretiert. In Direct3D 10 werden Datenstromeingaben, die als ganze Zahl gekennzeichnet sind, als 32-Bit-Ganzzahl interpretiert.
Darüber hinaus sind boolesche Werte jetzt alle Bits festgelegt oder alle Bits nicht festgelegt. Daten, die in bool konvertiert werden, werden als true interpretiert, wenn der Wert nicht gleich 0,0f ist (sowohl positive als auch negative Null sind falsch) und andernfalls false.

Bitweise Operatoren

Der allgemeine Shaderkern unterstützt die folgenden Bitzeigeroperatoren:

Operator Funktion
~ Logisches NOT
<< Linke Schicht
>> Rechte Umschalt
& Logisches UND
| Logisches ODER.
^ Logischer Xor
<<= Linke Schicht Gleich
>>= Gleich rechts umschalten
&= Und gleich
|= Oder gleich
^= Xor Gleich

Bitweise Operatoren sind definiert, um nur auf Int - und Uint-Datentypen zu funktionieren. Der Versuch, Bitzeigeroperatoren auf Float - oder Strukturdatentypen zu verwenden, führt zu einem Fehler. Bitweise Operatoren folgen demselben Rang wie C in Bezug auf andere Operatoren.

Binäre Casts

Das Casting zwischen einer ganzzahligen und einem Gleitkommatyp konvertiert den numerischen Wert nach C-Abschneidensregeln. Das Umwandeln eines Werts von einem Float in ein Int und zurück zu einem Float ist eine Verlustkonvertierung abhängig von der Genauigkeit des Zieldatentyps. Hier sind einige der Konvertierungsfunktionen: asfloat (DirectX HLSL), asint (DirectX HLSL), asuint (DirectX HLSL).

Binäre Casts können auch mithilfe von HLSL-systeminternen Funktionen ausgeführt werden. Dies führt dazu, dass der Compiler die Bitdarstellung einer Zahl in den Zieldatentyp neu interpretiert.

Shadermodell 4