OpenGL ES 3.x 基础:MobileGlues 的底层依赖
什么是 OpenGL ES
OpenGL ES(Embedded Systems)是 OpenGL 的嵌入式版本,专门为移动设备设计。它去掉了桌面 OpenGL 中不常用的功能,保留了核心渲染能力,同时保持较小的驱动体积和较低的 GPU 占用。
Android 平台只提供 OpenGL ES,不提供桌面 OpenGL,所以任何需要在 Android 上运行的图形应用最终都必须落到 OpenGL ES 上。
版本要求
MobileGlues 对 OpenGL ES 版本有明确要求:
| 版本 | 说明 |
|---|---|
| 3.2(推荐) | 最大扩展覆盖,支持 Compute Shader、Timer Query、Direct State Access |
| 3.0(最低) | 基本渲染正常,但某些高级特性不可用 |
低于 3.0 的设备无法运行 MobileGlues。市面上 2015 年之后发布的 Android 手机普遍支持 OpenGL ES 3.0,2019 年之后发布的机型大多支持 3.2。
MobileGlues 利用的 ES 特性
MobileGlues 的功能实现深度依赖 OpenGL ES 的具体特性:
- 片段着色器精度:GLSL ES 要求显式声明精度(highp / mediump / lowp),MobileGlues 自动为桌面着色器注入声明
- GLSL ES 着色器语言:MobileGlues 把桌面 GLSL 自动转换成 GLSL ES 语法
- 扩展支持开关:插件设置里能开关的
enableExtComputeShader、enableExtTimerQuery、enableExtDirectStateAccess都是在控制是否使用对应的 ES 扩展能力 - ANGLE 可选驱动:某些设备的原生 ES 驱动存在 bug 或兼容性问题时,可以切换到 ANGLE 走另一条路径
GLSL 着色器的关键差异
桌面 GLSL 和 GLSL ES 有几个会导致直接报错的差异,这也是 MobileGlues 自动做转换的原因:
- ES 不支持
layout(binding)语法,MobileGlues 会自动移除 - ES 不支持某些 desktop-only 的版本指令,MobileGlues 会处理
- ES 要求显式精度声明,MobileGlues 注入
precision highp float;和precision highp int;
这就是为什么很多桌面端能跑的光影直接丢到 Android 上会报着色器编译错误,而通过 MobileGlues 就正常。