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 | Registers | Version | |||
---|---|---|---|---|---|---|
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. //