Common-Shader Core
In Shadermodell 4 implementieren alle Shaderphasen die gleiche Basisfunktionalität mithilfe eines common-shader-Kerns. Darüber hinaus bieten jede der drei Shaderstufen (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 Pixelshaderstufe zu verwerfen. Das folgende Diagramm zeigt, wie Daten über eine Shaderstufe und die Beziehung des Common-Shader-Kerns mit Shaderspeicherressourcen fließen.
- Eingabedaten: Ein Vertex-Shader empfängt seine Eingaben aus der Eingabeassemblerphase; Geometrie- und Pixelshader erhalten ihre Eingaben aus der vorherigen Shaderphase. Zusätzliche Eingaben umfassen Systemwertsemantik, 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. Bei einem Geometrie-Shader kann die Datenmenge eines einzelnen Aufrufs variieren. Einige Ausgaben werden vom allgemeinen Shaderkern (z. B. Vertexposition und Renderzielarrayindex) interpretiert, andere werden von einer Anwendung interpretiert.
- Shadercode-: Shader können aus dem Speicher lesen, Vektor-Gleitkomma- und ganzzahlige arithmetische Operationen oder Flusssteuerungsvorgänge ausführen. Es gibt keine Beschränkung auf die Anzahl von Anweisungen, die in einem Shader implementiert werden können.
- Sampler: Sampler definieren das Beispiel und Filtern von Texturen. Bis zu 16 Sampler können gleichzeitig an einen Shader gebunden werden.
- Texturen: Texturen können mithilfe von Samplern gefiltert oder pro Texel direkt mit der laden systeminternen Funktion gelesen werden.
- Puffer: Puffer werden nie gefiltert, können aber direkt mit der laden systeminternen Funktion aus dem Speicher pro Element gelesen werden. Bis zu 128 Textur- und Pufferressourcen (kombiniert) können gleichzeitig an einen Shader gebunden werden.
- Konstantenpuffer: Konstantenpuffer sind für Shaderkonstantenvariablen optimiert. Bis zu 16 Konstantenpuffer können gleichzeitig an eine Shaderstufe gebunden werden. Sie sind für eine häufigere Aktualisierung von der CPU ausgelegt; daher verfügen sie über zusätzliche Größen-, Layout- und Zugriffsbeschränkungen.
Unterschiede zwischen Direct3D 9 und Direct3D 10:
- In Direct3D 9 verfügte jede Shadereinheit über eine einzelne, kleine Konstantenregisterdatei, um alle Konstanten-Shadervariablen zu speichern. Die Aufnahme aller Shader mit diesem begrenzten Konstantenraum erforderte 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 keine Beschränkung für die Anzahl der Konstantenpuffer, die eine Anwendung erstellen kann. Durch das Organisieren von Konstanten in Puffer nach Der Häufigkeit der Aktualisierung und Nutzung kann die zum Aktualisieren von Konstanten erforderliche Bandbreite für alle Shader erheblich reduziert werden.
Ganzzahlige und bitweise Unterstützung
Der allgemeine Shaderkern bietet einen vollständigen Satz IEEE-kompatibler 32-Bit-Ganzzahl- und Bitweiservorgänge. Diese Vorgänge ermöglichen eine neue Klasse von Algorithmen in Grafikhardwarebeispielen: Komprimierungs- und Verpackungstechniken, FFTs und Bitfield-Programmflusssteuerung.
Die int und uint Datentypen in Direct3D 10 HLSL werden 32-Bit-Ganzzahlen in der Hardware zugeordnet.
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 dürfen falsch sein) und andernfalls "false". |
Bitweise Operatoren
Der allgemeine Shaderkern unterstützt die folgenden bitweisen Operatoren:
Operator | Funktion |
---|---|
~ | Logisches Nicht |
<< | Linke Schicht |
>> | Umschalt rechts |
& | Logisch und |
| | Logisches Oder |
^ | Logischer Xor |
<<= | Linke Schicht gleich |
>>= | Umschalt rechts gleich |
&= | Und gleich |
|= | Oder gleich |
^= | Xor gleich |
Bitweise Operatoren sind nur für int und uint Datentypen definiert. Wenn Sie versuchen, bitweise Operatoren für float- zu verwenden, oder Struktur Datentypen anweist, tritt ein Fehler auf. Bitweise Operatoren folgen der gleichen Rangfolge wie C in Bezug auf andere Betreiber.
Binäre Umwandlungen
Umwandlungen zwischen einer ganzen Zahl und einem Gleitkommatyp konvertieren den numerischen Wert nach C-Abkürzungsregeln. Das Umwandeln eines Werts von einem float-in eine intund zurück zu einem float- ist eine Verlustkonvertierung, die von der Genauigkeit des Zieldatentyps abhängt. Hier sind einige der Konvertierungsfunktionen: asfloat (DirectX HLSL), asint (DirectX HLSL), asuint (DirectX HLSL).
Binäre Umwandlungen können auch mithilfe systeminterner HLSL-Funktionen ausgeführt werden. Dies führt dazu, dass der Compiler die Bitdarstellung einer Zahl in den Zieldatentyp erneut interpretiert.