0%

GLSL 基本语法

GLSL (OpenGL Shading Language) 是一种专门为图形编程设计的编程语言,用于在 GPU 上编写着色器。以下是 GLSL 的基本语法整理,包括数据类型、变量声明、流程控制、函数定义等。


1. 文件结构

GLSL 程序主要分为两种类型:

  • **顶点着色器 (Vertex Shader)**:处理顶点相关的操作。
  • **片段着色器 (Fragment Shader)**:处理片段(像素)相关的操作。

常见的 GLSL 文件扩展名:

  • .vert:顶点着色器。
  • .frag:片段着色器。

每个 GLSL 文件的入口函数是 void main(),类似于 C 语言的 main 函数。

1
2
3
void main() {
// 着色器的入口点
}

2. 数据类型

标量类型

类型 描述
float 单精度浮点数
int 整数
uint 无符号整数
bool 布尔值 (true/false)

向量类型

GLSL 提供了用于存储 2 到 4 个值的向量类型。

类型 描述
vec2 2D 向量(2 个 float
vec3 3D 向量(3 个 float
vec4 4D 向量(4 个 float
ivec2 2D 整数向量
ivec3 3D 整数向量
ivec4 4D 整数向量
bvec2 2D 布尔向量
bvec3 3D 布尔向量
bvec4 4D 布尔向量

矩阵类型

类型 描述
mat2 2x2 浮点数矩阵
mat3 3x3 浮点数矩阵
mat4 4x4 浮点数矩阵

纹理采样器类型

类型 描述
sampler2D 2D 纹理采样器
sampler3D 3D 纹理采样器
samplerCube 立方体纹理采样器

3. 变量声明

GLSL 中变量的作用域和生命周期通过修饰符定义:

修饰符类型

修饰符 描述
in 输入变量(顶点着色器从外部传入的数据)
out 输出变量(顶点着色器传递给片段着色器的数据)
uniform 全局常量,通常由 CPU 设置,在整个渲染过程中不变
const 编译时常量
layout 用于指定变量位置或属性

示例

1
2
3
uniform mat4 uModelViewProjectionMatrix; // 由外部传入的模型-视图-投影矩阵
in vec3 aPosition; // 顶点位置
out vec4 vColor; // 传递给片段着色器的颜色

4. 内置变量

GLSL 提供了一些内置变量,主要用于在着色器程序之间传递数据。

顶点着色器内置变量

变量 描述
gl_Position 顶点的裁剪空间位置
gl_PointSize 点的大小(仅适用于点渲染模式)

片段着色器内置变量

变量 描述
gl_FragColor 输出颜色(已弃用,使用 out 替代)
gl_FragCoord 当前片段的窗口坐标

5. 流程控制

条件语句

1
2
3
4
5
if (condition) {
// 条件为真时执行
} else {
// 条件为假时执行
}

循环

1
2
3
4
5
6
7
8
9
// for 循环
for (int i = 0; i < 10; i++) {
// 循环体
}

// while 循环
while (condition) {
// 循环体
}

6. 函数

定义和调用

GLSL 中的函数类似于 C 的函数,可以有返回值和参数。

1
2
3
4
5
6
7
8
9
float calculateLight(vec3 normal, vec3 lightDir) {
return max(dot(normal, lightDir), 0.0);
}

void main() {
vec3 normal = vec3(0.0, 0.0, 1.0);
vec3 lightDir = vec3(1.0, 1.0, 1.0);
float lightIntensity = calculateLight(normal, lightDir);
}

7. 常用内置函数

向量操作

函数 描述
dot(v1, v2) 向量点积
cross(v1, v2) 向量叉积(仅适用于 vec3 类型)
length(v) 向量长度
normalize(v) 将向量标准化(长度归一化)

数学函数

函数 描述
sin(x) 正弦函数
cos(x) 余弦函数
pow(x, y) 幂运算
sqrt(x) 平方根
abs(x) 绝对值
clamp(x, min, max) 将值限制在 [min, max] 范围内

纹理采样

函数 描述
texture(sampler, coord) 从纹理中采样

8. 顶点和片段着色器示例

顶点着色器

1
2
3
4
5
6
7
8
9
10
11
12
13
#version 330 core

layout(location = 0) in vec3 aPosition; // 顶点位置
layout(location = 1) in vec3 aColor; // 顶点颜色

out vec3 vColor; // 传递到片段着色器的颜色

uniform mat4 uModelViewProjectionMatrix;

void main() {
gl_Position = uModelViewProjectionMatrix * vec4(aPosition, 1.0); // 转换到裁剪空间
vColor = aColor; // 传递颜色
}

片段着色器

1
2
3
4
5
6
7
8
#version 330 core

in vec3 vColor; // 从顶点着色器接收的颜色
out vec4 FragColor; // 最终输出的片段颜色

void main() {
FragColor = vec4(vColor, 1.0); // 设置片段颜色
}

总结

  • GLSL 基于 C 语言,但有自己的特性,比如向量和矩阵操作。
  • 变量通过 inout 在着色器之间传递。
  • GLSL 内置了大量用于图形计算的函数和变量。
  • 顶点和片段着色器需要协同工作,处理从顶点到像素的整个渲染流水线。

通过掌握以上语法,你可以编写简单而高效的着色器程序,控制图形渲染的细节。