OpenGL GLSL语法基础

基本类型

sampler

采样器类型,作为访问纹理图像的不透明句柄。

类型转换

GLSL中变量的类型转换非常严格,没有隐式类型转换,比C++的要求更严格。不同类型间的转换需要使用类似构造函数的语法。

向量和矩阵

向量特性

  • 向量不是数组(例如float coeff[3]才是数组)
  • OpenGL的向量使用列主序,与C/C++不同,相当于斜对角镜像
  • 向量默认是float类型,如vec2/3/4,mat2/3/4或mat2x3,mat3x4
  • 整型向量使用ivec前缀
  • 布尔向量使用bvec前缀

矩阵表示

mat3x4表示三列四行的矩阵,对应C++中的[4][3]矩阵

限定符

布局限定符(layout)

  • 只能用于顶点着色器的输入
  • 顶点着色器的输出和片段着色器不可使用
1
layout(location = 0) in vec4 vPosition;  // 指定输入变量vPosition的绑定位置为0

数据传输

1
2
3
4
5
// 将顶点数组传入着色器向量
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, vVertices);

// 激活对应位置的向量
glEnableVertexAttribArray(0);

类型限定符

in

用于声明着色器的输入变量

out

声明着色器阶段的输出变量,这些变量会传递到下一个着色器阶段

invariant

确保多道渲染时着色器计算结果的一致性,避免因计算顺序等因素导致的误差

uniform

  • 指定uniform类型变量,其值在绘制调用间保持不变
  • 操作uniform的方法:
1
2
glUseProgram(programId);
glUniform2f(offsetLocationId, fXOffset, fYOffset);