texm3x3tex

DirectX8

Microsoft DirectX 8.1 (pixel shader versions 1.0, 1.1, 1.2, 1.3)

texm3x3tex

Performs a 3×3 matrix multiply and uses the result to do a texture lookup. texm3x3tex must be used with two texm3x3pad instructions.

texm3x3tex dest, src
Argument Description RegistersVersion
vn cn tn rn
dest Destination register x 1.0, 1.1, 1.2, 1.3
src Source register x 1.0, 1.1, 1.2, 1.3

To learn more about registers, see Registers.

Remarks

This instruction is used as the final of three instructions representing a 3×3 matrix multiply operation, followed by a texture lookup. The 3×3 matrix is comprised of the texture coordinates of the third texture stage and the two preceding texture stages. The resulting three-component vector (u,v,w) is used to sample the texture in stage 3. Any texture assigned to the preceding two texture stages is ignored. The 3×3 matrix multiply is typically useful for orienting a normal vector to the correct tangent space for the surface being rendered.

This instruction must be used with two texm3x3pad instructions. Texture registers must use the following sequence.

tex t(n)                 // Define tn as a standard 3-vector (tn must
                         // be defined in some way before it is used).
texm3x3pad t(m),   t(n)  // where m > n
                         // Perform first row of matrix multiply.
texm3x3pad t(m+1), t(n)  // Perform second row of matrix multiply.
texm3x3tex t(m+2), t(n)  // Perform third row of matrix multiply to get a
                         // 3-vector with which to sample texture
                         // associated with texture stage m+2.

Here is more detail about how the 3×3 multiply is accomplished.

// The first texm3x3pad instruction performs the first row of the multiply 
// to find u'.
u' = TextureCoordinates(stage m)UVW • t(n)RGB   

// The second texm3x3pad instruction performs the second row of the multiply 
// to find v'.
v' = TextureCoordinates(stage m+1)UVW • t(n)RGB   

// The texm3x3spec instruction performs the third row of the multiply
// to find w'.
w' = TextureCoordinates(stage m+2)UVW • t(n)RGB  

// Lastly, the texm3x3tex instruction samples t(m+2) with (u',v',w')
// and stores the result in t(m+2).
t(m+2)RGBA = TextureSample(stage m+2)RGBA using (u', v', w') as coordinates.

Example

// Here is an example shader with the texture maps identified and
// the texture stages identified.
ps.1.0
tex t0                // Bind texture in stage 0 to register t0.
texm3x3pad  t1,  t0   // First row of matrix multiply.
texm3x3pad  t2,  t0   // Second row of matrix multiply.
texm3x3tex  t3,  t0   // Third row of matrix multiply to get a
                      // 3-vector with which to sample texture at stage 3
mov r0, t3            // output result.

// This example requires the following texture stage setup.
//
// Stage 0 is assigned a texture map with normal data. This is often 
// referred to as a bump map. The data is (XYZ) normals for 
// each texel. Texture coordinate set 0 defines how to sample this 
// normal map.
//
// Texture coordinate set 1 is assigned to row 1 of the 3×3 matrix. 
// Any texture assigned to stage 1 is ignored.
//
// Texture coordinate set 2 is assigned to row 2 of the 3×3 matrix. 
// Any texture assigned to stage 2 is ignored.
//
// Texture coordinate set 3 is assigned to row 3 of the 3×3 matrix. 
// A volume or cube texture should be set to stage 3  for lookup by the 
// transformed 3-D vector.
//