OpenGL ES (三)着色语言 GLSL

1,160 阅读3分钟
OpenGL ES(OpenGL for Embedded Systems)是以手持和嵌⼊式设备为⽬标的⾼级 3D 图形应⽤程序编程接口(API)。 OpenGL ES 是目前智能手机中占据统治地位的图形 API。支持的平台包括:iOS,Andriod,BlackBerry,bada,LinuxWindows,它还是基于浏览器的 3D 图形 Web 标准WebGL 的基础。

OpenGL ES 的版本

  • OpenGL ES 1.X :针对固定功能流⽔水管线硬件
  • OpenGL ES 2.X :针对可编程流⽔水管线硬件
  • OpenGL ES 3.X :OpenGL ES 2.0的扩展

EGL (Embedded Graphics Library )

  • OpenGL ES 命令需要渲染上下文和绘制表面才能完成图形图像的绘制
  • 渲染上下文: 存储相关OpenGL ES 状态
  • 绘制表面: 是用于绘制图元的表面,它指定渲染所需要的缓存区类型,例如颜色缓存 区,深度缓冲区和模板缓存区.
  • OpenGL ES API 并没有提供如何创建渲染上下文或者上下文如何连接到原生窗口系统.EGL 是Khronos 渲染API(如OpenGL ES) 和原生窗口系统之间的接口. 唯一⽀持 OpenGL ES 却不⽀持EGL 的平台是iOS

EGL的主要功能

  1. 和本地窗口系统(native windowing system)通讯
  2. 查询可用的配置
  3. 创建OpenGL ES 可用的“绘图表面“(drawing surface)
  4. 同步不同类别的API之间的渲染,比如在OpenGL ES 和OpenVG之间同步,或者在OpenGL和本地窗口的绘图命令之间
  5. 管理”渲染资源“,比如纹理映射(Rendering map)

GLSL语言简介

GLSL(OpenGL Shading Language) 全称 OpenGL 着色语言,是用来在 OpenGL 中着色编程的语言,也即开发人员写的短小的自定义程序,他们是在图形卡的 GPU上执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性。

GLSL 其使用 C 语言作为基础高阶着色语言,避免了使用汇编语言或硬件规格语言的复杂性。

GLSL 的变量命名方式与 C 语言类似,可使用字母,数字以及下划线,不能以数字开头。还需要注意的是,变量名不能以 gl_ 作为前缀,这个是GLSL 保留的前缀,用于GLSL 的内部变量。

向量数据类型


矩阵数据类型


变量存储限定符号

GLSL 允许自定义函数,但参数默认是以值形式(in 限定符)传入的,也就是说任何变量在传入时都会被拷贝一份,若想以引用方式传参,需要增加函数参数限定符。


OpenGL ES 错误处理

如果不正确使⽤OpenGL ES 命令,应⽤程序就会产⽣⼀个错误编码。这个错误编码将被记录,可以⽤glGetError查询。在应⽤程序⽤glGetError查询第⼀个错误代码之前,不会记录其他错误代码。⼀旦查询到错误代码,当前错误代码便复位为GL_NO_ERROR