GLSL (OpenGL Shading Language) 是一种专门为图形编程设计的编程语言,用于在 GPU 上编写着色器。以下是 GLSL 的基本语法整理,包括数据类型、变量声明、流程控制、函数定义等。
1. 文件结构
GLSL 程序主要分为两种类型:
- **顶点着色器 (Vertex Shader)**:处理顶点相关的操作。
- **片段着色器 (Fragment Shader)**:处理片段(像素)相关的操作。
常见的 GLSL 文件扩展名:
.vert
:顶点着色器。
.frag
:片段着色器。
每个 GLSL 文件的入口函数是 void main()
,类似于 C 语言的 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 (int i = 0; i < 10; i++) { }
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 语言,但有自己的特性,比如向量和矩阵操作。
- 变量通过
in
和 out
在着色器之间传递。
- GLSL 内置了大量用于图形计算的函数和变量。
- 顶点和片段着色器需要协同工作,处理从顶点到像素的整个渲染流水线。
通过掌握以上语法,你可以编写简单而高效的着色器程序,控制图形渲染的细节。