| ?/TD> | 
| Microsoft DirectX 9.0 | 
The various types of output registers have been collapsed into 12 o (output) registers (2 for color, 8 for texture, 1 for position, and 1 for fog and point size). These can be used for anything the user wants to interpolate for the pixel shader: texture coordinates, colors, fog, etc.
Output declarations are introduced, whereby semantics are assigned to each register. Old oPos and oPts are replaced by declaring an o register with a position or pointsize semantic, further described here.
There are 12 "out" registers. Ten have 4-components (xyzw) (any 10, not necessarily o0 to o9), another one must be declared as position (all 4-components), and optionally one more can be a scalar point size.
The syntax for declaring outputs (o registers) is similar to the declarations for the inputs:
| dcl_semantics o[.write_mask] | 
Where:
| Vertex shader versions | 3_0 | 3_sw | 
|---|---|---|
| dcl_usage | x | x | 
All dcl_usage instructions must appear before the first executable instruction.
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_positiont  o7.xyzw // positiont 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.
| Minimum operating system | Windows 98 | 
|---|