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, eines für position und eines für Nebel und Punktgröße). Diese können für alles verwendet werden, was der Benutzer für den Pixelshader interpolieren möchte: Texturkoordinaten, Farben, Nebel usw.

Ausgaberegister erfordern Deklarationen, die Semantik enthalten. Bei instance werden die alten Positions- und Punktgrößenregister ersetzt, indem ein Ausgaberegister mit einer Positions- oder Punktgrößensemantik deklariert wird.

Von den zwölf Ausgaberegistern haben alle zehn (nicht notwendigerweise o0 bis o9) vier Komponenten (xyzw), eine andere muss als Position deklariert werden (und muss auch alle vier Komponenten enthalten), und optional kann eine weitere eine Skalarpunktgröße sein.

Syntax

Die Syntax zum Deklarieren von Ausgaberegistern ähnelt den Deklarationen für das Eingaberegister:

  • dcl_semantics o[.write_mask]

Wo:

  • dcl_semantics können den gleichen Satz von Semantik wie für die Eingabedeklaration verwenden. Semantische Namen stammen von D3DDECLUSAGE (und werden mit einem Index wie position3 gekoppelt). Es muss immer ein Ausgaberegister mit der Positiont0-Semantik vorhanden sein, wenn es 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 Pixelshadern hinausgehen. Bei Shadern mit Flusssteuerung wird davon ausgegangen, dass die Ausgabe im ungünstigsten Fall deklariert wird. Es gibt keine Standardwerte, wenn ein Shader nicht tatsächlich ausgibt, was er deklariert (aufgrund der Flusssteuerung).
  • o ist ein Ausgaberegister. Siehe Output_Registers.
  • write_mask gibt das gleiche Ausgaberegister an, das mehrmals deklariert werden kann (sodass eine andere Semantik auf einzelne Komponenten angewendet werden kann), jedes Mal mit einer eindeutigen Schreibmaske. Dieselbe Semantik kann jedoch nicht mehrmals in einer Deklaration verwendet werden. Dies bedeutet, dass Vektoren vier Komponenten oder weniger sein müssen und keine Registergrenzen mit vier Komponenten (einzelne Register) überschreiten dürfen. Wenn die Punktgrößensemantik verwendet wird, sollte sie über eine vollständige Schreibmaske verfügen, da sie als Skalar betrachtet wird. Wenn die Positionssemantik verwendet wird, sollte sie über eine vollständige Schreibmaske verfügen, da alle vier Komponenten geschrieben werden müssen.

Bemerkungen

Vertexshaderversionen 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.

Anweisungen zum Vertex-Shader