texm3x3vspec - ps

执行 3x3 矩阵乘法,并使用结果执行纹理查找。 这可用于眼睛射线矢量不恒定的反射和环境映射。 texm3x3vspec 必须与两个 texm3x3pad - ps 指令结合使用。 如果眼睛射线矢量为常量, 则 texm3x3spec - ps 指令将执行相同的矩阵乘法和纹理查找。

语法

texm3x3vspec dst, src

 

其中

  • dst 是目标寄存器。
  • src 是源寄存器。

备注

像素着色器版本 1_1 1_2 1_3 1_4 2_0 2_x 2_sw 3_0 3_sw
texm3x3vspec x x x

 

此指令执行 3x3 矩阵乘法运算的最后一行,将生成的向量解释为法向量以反射眼睛射线矢量,然后使用反射矢量作为纹理查找的纹理地址。 它的工作方式与 texm3x3spec - ps 类似,只不过眼睛射线矢量取自纹理坐标的第四个分量。 3x3 矩阵乘法通常用于将法向量定向到要呈现的图面的正确正切空间。

3x3 矩阵由第三个纹理阶段和前两个纹理阶段的纹理坐标组成。 生成的后反射矢量 (UVW) 用于对阶段 3 中的纹理采样。 分配给前两个纹理阶段的任何纹理将被忽略。

此指令必须与 texm3x3pad 指令一起使用。 纹理寄存器必须使用以下序列。

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
texm3x3vspec t(m+2), t(n)   // Perform third row of matrix multiply
                            // Then do a texture lookup on the texture
                            // associated with texture stage m+2

第一个 texm3x3pad 指令执行乘法的第一行以查找 u'

u' = TextureCoordinates (阶段 m) UVW * t (n) RGB

第二个 texm3x3pad 指令执行乘法的第二行以查找 v'

v' = TextureCoordinates (阶段 m+1) UVW * t (n) RGB

texm3x3spec 指令执行乘法的第三行以查找 w'

w' = TextureCoordinates (阶段 m+2) UVW * t (n) RGB

texm3x3vspec 指令也执行反射计算。

(u' , v' , w' ) = 2*[ (N*E) / (N*N) ]*N - E

其中,正常 N 由

N = (u' , v' , w' )

眼睛射线矢量 E 由

E = (TextureCoordinates (阶段 m) Q

textureCoordinates (stage m+1) Q

textureCoordinates (stage m+2) Q )

最后,texm3x3vspec 指令使用 (u',v',w') 对 t (m+2) 采样,并将结果存储在 t (m+2) 中。

t (m+2) RGBA = TextureSample (阶段 m+2) RGBA ,使用 (u' , v' , w' ) 作为坐标

示例

下面是一个示例着色器,其中标识了纹理贴图,并标识了纹理阶段。

ps_1_1
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
texm3x3vspec t3,  t0  // Third row of matrix multiply to get a 3-vector
                      // Reflect 3-vector by the eye-ray vector
                      // Use reflected vector to do a texture lookup
                      //   at stage 3
mov r0, t3            // Output the result

此示例需要以下纹理阶段设置。

  • 阶段 0 分配有一个包含法线数据的纹理贴图。 这通常称为凹凸贴图。 数据 (XYZ) 每个纹素的法线。 阶段 n 处的纹理坐标定义如何对此法线贴图采样。
  • 纹理坐标集 m 分配给 3x3 矩阵的第 1 行。 将忽略分配给阶段 m 的任何纹理。
  • 纹理坐标集 m+1 分配给 3x3 矩阵的第 2 行。 将忽略分配给阶段 m+1 的任何纹理。
  • 纹理坐标集 m+2 分配给 3x3 矩阵的第 3 行。 为阶段 m+2 分配了一个体积或立方体纹理贴图。 纹理 (RGBA) 提供颜色数据。
  • 眼射线矢量 E 传递到第四分量的指令中, (q) 阶段 m、m+1 和 m+2 的纹理坐标数据。

像素着色器说明