texm3x3spec - ps
执行 3x3 矩阵乘法,并使用结果执行纹理查找。 这可用于反射反射和环境映射。 texm3x3spec 必须与两个 texm3x3pad - ps 指令结合使用。
语法
texm3x3spec dst、src0、src1 |
---|
其中
- dst 是目标寄存器。
- src0 和 src1 是源寄存器。
备注
像素着色器版本 | 1_1 | 1_2 | 1_3 | 1_4 | 2_0 | 2_x | 2_sw | 3_0 | 3_sw |
---|---|---|---|---|---|---|---|---|---|
texm3x3spec | x | x | x |
此指令执行 3x3 矩阵乘法的最后一行,使用生成的矢量作为法向量来反射眼睛射线矢量,然后使用反射矢量执行纹理查找。 着色器从常量寄存器读取眼射线矢量。 3x3 矩阵乘法通常用于将法向量定向到要呈现的图面的正确正切空间。
3x3 矩阵由第三个纹理阶段和前两个纹理阶段的纹理坐标组成。 生成的后反射矢量 (u,v,w) 用于对最终纹理阶段的纹理进行采样。 分配给前两个纹理阶段的任何纹理将被忽略。
此指令必须与两个 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
texm3x3spec t(m+2), t(n), c0 // Perform third row of matrix multiply
// Then do a texture lookup on the texture
// associated with texture stage m+2
第一个 texm3x3pad 指令执行乘法的第一行以查找 u'。
u' = TextureCoordinates (stage 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
然后,texm3x3spec 指令执行反射计算。
(u' , v' , w' ) = 2*[ (N*E) / (N*N) ]*N - E
其中,正常 N 由
N = (u' , v' , w' )
眼睛射线矢量 E 由常数寄存器提供
E = c# (可以使用任何常量 register--c0、c1、c2 等)
最后,texm3x3spec 指令使用 (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 (tn must
// be defined in some way before it is used)
texm3x3pad t1, t0 // First row of matrix multiply
texm3x3pad t2, t0 // Second row of matrix multiply
texm3x3spec t3, t0, c# // Third row of matrix multiply to get a 3-vector
// Reflect 3-vector by the eye-ray vector in c#
// Use reflected vector to lookup texture in
// 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 由常量寄存器 E = c# 提供。
相关主题