GLSL 矩阵和采样器,3D场景中的移位、旋转、缩放等变换都是由矩阵的运算来实现的,因此3D场景的开发中会非常多地使用矩阵。故着色语言也提供了对矩阵类型的支持。这大大方便了开发。免去了自行构建矩阵的麻烦。
矩阵
矩阵按尺寸分为2×2矩阵、2×3矩阵、2×4矩阵、3×2矩阵、3×3矩阵、3×4矩阵、4×2矩阵、4×3矩阵和4×4矩阵,其中矩阵类型的第一个数字表示矩阵的列数,第二个数字表示矩阵的行数,如下所示:
矩阵类型 | 说明 | 矩阵类型 | 说明 |
---|---|---|---|
mat2 |
2×2 的浮点数矩阵 | mat2x2 |
2×2 的浮点数矩阵 |
mat3 |
3×3 的浮点数矩阵 | mat2x3 |
2×3 的浮点数矩阵 |
mat4 |
4×4 的浮点数矩阵 | mat2x4 |
2×4 的浮点数矩阵 |
mat3x2 |
3×2 的浮点数矩阵 | mat4x2 |
4×2 的浮点数矩阵 |
mat3x3 |
3×3 的浮点数矩阵 | mat4x3 |
4×3 的浮点数矩阵 |
mat3x4 |
3×4 的浮点数矩阵 | mat4x4 |
4×4 的浮点数矩阵 |
矩阵类型的基本用法如下:
mat2 m2; //声明一个mat2类型的矩阵
mat3 m3; //声明一个mat3类型的矩阵
mat4 m4; //声明一个mat4类型的矩阵
mat3x2 m5; //声明一个mat3x2类型的矩阵
着色语言中,矩阵都是按列顺序组织的,也就是一个矩阵可以看作由几个列向量组成,例如,mat3就可以看作由3个vec3组成。另外,mat2与mat2x2、mat3以及mat4与mat4x4是3组两两完全相同的类型,只是其类型的名称不同而已。
可以将矩阵作为列向量的数组来访问,如matrix 为一个mat4,可以使用 matrix[2]
取到该数据的第3列,其为一个vec4;也可以使用 matrix[2][2]
取得3列的向量的第3个分量,其中一个float,其他以此类推。
从数学上讲,矩阵看作由向量组成时有两种选择,可以将矩阵看作由多个行向量组成或看作多个列向量组成。虽然不同的选择功能一样,但是具体进行计算时是有所不同的,因此了解着色语言的选择非常重要。对这方面数学不太了解的读者可以参考一些线性代数的相关资料。
采样器
采样器是着色语言中不同 C 语言的一种特殊的基本数据类型,其专门用来进行纹理采样的相关操作。一般情况下,一个采样器变量代表一副或一套纹理贴图,如下表所示:
采样器类型 | 说明 | 采样器类型 | 说明 |
---|---|---|---|
sampler2D | 用于访问浮点型的二维纹理 | issampler3D | 用于访问整型的三维纹理 |
sampler3D | 用于访问浮点型的三维纹理 | issamplerCube | 用于访问整型的立方贴图纹理 |
samplerCube | 用于访问浮点型的立方贴图纹理 | issampler2DArray | 用于访问整型的二维纹理数组 |
samplerCubeShadow | 用于访问浮点型的立方阴影纹理 | usampler2D | 用于访问无符号整型的二维纹理 |
sampler2DShadow | 用于访问浮点型的二维阴影纹理 | usampler3D | 用于访问无符号整型的三维纹理 |
sampler2DArray | 用于访问浮点型的二维纹理数组 | usamplerCube | 用于访问无符号整型的立方贴图纹理 |
sampler2DArrayShadow | 用于访问浮点型的二维阴影纹理数组 | usampler2DArray | 用于访问无符号整型的二维纹理数组 |
issampler2D | 用于访问整型的二维纹理 |
需要注意的是,与前面介绍的几类变量不同,采样器变量不能在着色器中进行初始化,一般情况下采样器都用 uniform 限定符来修饰,从宿主语言(如C++)接收传递进着色器的值。此外,采样器变量也可以用作函数的参数。但是作为函数参数时不可以使用 out 或 inout 修饰符来修饰。