学习OpenGL——第四天

107 阅读2分钟

GLSL 简介

GLSL(OpenGL Shading Language)是专为 OpenGL 图形 API 设计的着色器编程语言,也是现代 OpenGL 渲染管线的核心。它允许开发者直接编写运行在 GPU 上的程序代码,这些程序被称为着色器,负责处理图形渲染管线中的不同阶段。


主要特点

  • 高级编程接口:GLSL 提供灵活的接口,让开发者能够精细控制 GPU 的渲染行为,实现复杂的视觉效果和自定义算法。
  • 并行执行:GLSL 代码在 GPU 上高度并行,每个着色器实例可独立处理一个顶点或像素,极大提升了大规模图形计算的效率。
  • 数据交互机制:通过 uniform 变量、varying 变量(现代版本中为 in/out 变量)和纹理采样器等方式,与 CPU 程序高效交换数据,如变换矩阵、光照参数、纹理图像等。
  • 广泛应用:GLSL 已成为现代图形编程的标准语言,不仅用于 OpenGL,还衍生出 HLSL(DirectX)、WebGL GLSL 等。掌握 GLSL 是现代图形开发的基础技能。

Uniform 变量详解

Uniform 变量是从 CPU 程序向 GPU 着色器传递数据的常用方式,与顶点属性不同,具有以下特点:

  • 全局可用:Uniform 变量在每个着色器程序对象中唯一,并可被该程序的任意着色器阶段访问。
  • 持久性强:Uniform 的值会一直保持,直到被显式更新或重置。

支持的数据类型

Uniform 可用于传递多种类型的数据:

  • 标量:float、int、bool
  • 向量:vec2、vec3、vec4、ivec2、ivec3、ivec4、bvec2、bvec3、bvec4
  • 矩阵:mat2、mat3、mat4、mat2x3、mat3x2 等
  • 采样器:sampler2D、sampler3D、samplerCube、sampler2DShadow 等
  • 数组:各种类型的数组
  • 结构体:自定义结构体类型

如何获取 Uniform 位置

// 在着色器程序链接后获取 uniform 变量的位置 
glUseProgram(shaderProgram); 
GLuint uniformLoc = glGetUniformLocation(shaderProgram, "uniformName"); 

// 检查 uniform 是否存在 
if (uniformLoc == -1) { 
    std::cout << "Warning: uniform 'uniformName' not found!" << std::endl; 
}

设置 Uniform 数据的一致性

// 设置 uniform 前需激活着色器程序 
glUseProgram(shaderProgram); 
glUniformMatrix4fv(modelMatrixLoc, 1, GL_FALSE, &modelMatrix[0][0]);