GLSL 矩阵和采样器

GLSL 矩阵和采样器,3D场景中的移位、旋转、缩放等变换都是由矩阵的运算来实现的,因此3D场景的开发中会非常多地使用矩阵。故着色语言也提供了对矩阵类型的支持。这大大方便了开发。免去了自行构建矩阵的麻烦。

GLSL 矩阵和采样器

矩阵

矩阵按尺寸分为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 修饰符来修饰。

赞(1)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址