dcl_usage Ausgabe (sm1, sm2, sm3 - vs asm)
Die verschiedenen Arten von Ausgaberegistern wurden in zwölf Ausgaberegister reduziert (zwei für Farbe, acht für Textur, eine für Position und eine für Nebel und Punktgröße). Diese können für alles verwendet werden, was der Benutzer für den Pixel-Shader interpolieren möchte: Texturkoordinaten, Farben, Nebel usw.
Ausgaberegister erfordern Deklarationen, die Semantik enthalten. So werden z. B. die alten Positions- und Punktgrößenregister durch Deklarieren eines Ausgaberegisters durch eine Position oder eine Punktgrößesemantik ersetzt.
Von den zwölf Ausgaberegistern müssen zehn (nicht unbedingt o0 bis o9) vier Komponenten (xyzw) aufweisen, eine andere muss als Position deklariert werden (und muss auch alle vier Komponenten enthalten), und optional kann es sich um eine Skalarpunktgröße handeln.
Syntax
Die Syntax zum Deklarieren von Ausgaberegistern ähnelt den Deklarationen für das Eingaberegister:
- dcl_semantics o[.write_mask]
Wo:
- dcl_semantics können dieselbe Gruppe von Semantik wie für die Eingabedeklaration verwenden. Semantische Namen stammen aus D3DDECLUSAGE (und werden mit einem Index gekoppelt, z. B. Position3). Es muss immer ein Ausgaberegister mit der Positiont0-Semantik vorhanden sein, wenn sie nicht für die Verarbeitung von Scheitelpunkten verwendet wird. Die Positiont0-Semantik und die Pointsize0-Semantik sind die einzigen, die über die einfache Verknüpfung von Vertex zu Pixel-Shadern hinausgehen. Bei Shadern mit Flusssteuerung wird davon ausgegangen, dass die Ausgabe im schlimmsten Fall deklariert wird. Es gibt keine Standardwerte, wenn ein Shader nicht tatsächlich ausgibt, was es deklariert (aufgrund der Flusssteuerung).
- o ist ein Ausgaberegister. Siehe Output_Registers.
- write_mask gibt dasselbe Ausgaberegister an, das mehrmals deklariert werden kann (sodass unterschiedliche Semantik auf einzelne Komponenten angewendet werden kann), jedes Mal mit einem eindeutigen Schreibformat. Die gleiche Semantik kann jedoch nicht mehrmals in einer Deklaration verwendet werden. Dies bedeutet, dass Vektoren vier Komponenten oder weniger sein müssen und nicht über vier Komponentenregistergrenzen (einzelne Register) hinausgehen können. Wenn die Semantik der Punktgröße verwendet wird, sollte es über eine vollständige Schreibmaske verfügen, da sie als Skalar betrachtet wird. Wenn die Positionsemantik verwendet wird, sollte es über ein vollständiges Schreibformat verfügen, da alle vier Komponenten geschrieben werden müssen.
Hinweise
Vertex-Shaderversionen | 3_0 | 3_sw |
---|---|---|
dcl_usage | x | x |
Alle dcl_usage Anweisungen müssen vor der ersten ausführbaren Anweisung angezeigt werden.
Deklarationsbeispiele
vs_3_0
dcl_color4 o3.x // color4 is a semantic name.
dcl_texcoord3 o3.yz // Different semantics can be packed into one register.
dcl_fog o3.w
dcl_tangent o4.xyz
dcl_position o7.xyzw // position must be declared to some unique register
// in a vertex shader, with all 4 components.
dcl_psize o6 // Pointsize cannot have a mask
// (that is, mask is full .xyzw)
// This is an implied scalar register.
// No other semantics can be assigned to any components
// of this register.
// If pointsize declaration is not used (typical),
// only 11 "out" registers are available, not 12.
// Pixel shaders cannot see this value.
Zugehörige Themen