Skip to content

变量类型

标量类型

  • float: 单精度浮点数
glsl
float a = 1.0;
float b = 2.0;
float c = a / b;  // 可进行操作运算
  • int: 整数
glsl
int a = 1;
int b = 2;
int c = a * b;

// int可以转换为float:
float a = 1.0;
int b = 2;
float c = a * float(b);
  • bool: 布尔值
glsl
bool foo = true;
bool bar = false;

向量类型

GLSL 提供了 2-4 维的向量类型:

  • vec2: 二维向量,包含两个 float 类型的分量
glsl
vec2 foo = vec2(1.0, 2.0);
glsl
vec2 foo = vec2(0.0);
foo.x = 1.0;
foo.y = 2.0;
  • vec3: 三维向量,包含三个 float 类型的分量
glsl
vec3 bar = vec3(1.0, 2.0, 3.0);
bar.z = 4.0;
glsl
// 使用单个值初始化
vec3 v3 = vec3(1.0); // 所有分量都是1.0
glsl
// 从vec2创建vec3
vec2 foo = vec2(1.0, 2.0);
vec3 bar = vec3(foo, 3.0);
glsl
// 从vec3取部分创建vec2
vec3 foo = vec3(1.0, 2.0, 3.0);
vec2 bar = foo.xy;

// 或者改变取值顺序
vec2 bar = foo.yx;
  • vec4: 四维向量,包含四个 float 类型的分量
glsl
vec4 foo = vec4(1.0, 2.0, 3.0, 4.0);
vec4 bar = vec4(foo.zw, vec2(5.0, 6.0));

矩阵类型

GLSL 支持 2x2 到 4x4 的矩阵:

  • mat2: 2x2 浮点矩阵
glsl
mat2 m2 = mat2(1.0, 2.0, 3.0, 4.0);
  • mat3: 3x3 浮点矩阵
glsl
mat3 m3 = mat3(
  1.0, 2.0, 3.0,
  4.0, 5.0, 6.0,
  7.0, 8.0, 9.0
);
  • mat4: 4x4 浮点矩阵
glsl
mat4 m4 = mat4(1.0); // 对角线为1.0,其他为0.0

采样器类型

用于纹理采样的特殊类型:

  • sampler2D: 2D 纹理
  • samplerCube: 立方体贴图
  • sampler3D: 3D 纹理
  • sampler2DArray: 2D 纹理数组

限定符

存储限定符

  • const: 编译时常量

  • attribute: 顶点属性(顶点着色器专用)

  • uniform: 统一变量

    uniform 声明的变量可以在 javascript 和 shader 之间传值,并且在顶点着色器和片元着色器中均可以接收。

  • varying: 顶点着色器到片段着色器的插值变量

精度限定符

  • highp: 高精度
  • mediump: 中等精度
  • lowp: 低精度

数组

支持固定大小的数组:

glsl
float array[10]; // 10个浮点数的数组
vec3 vectors[5]; // 5个vec3的数组

结构体

可以定义自定义结构体:

glsl
struct Light {
    vec3 position;
    vec3 color;
    float intensity;
};

Light light = Light(vec3(0.0), vec3(1.0), 1.0);