OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 的一个子集,专为嵌入式系统、移动设备(如智能手机和平板)、游戏主机和其他资源受限的平台设计。它由 Khronos Group 维护,广泛用于 Android、iOS 等移动操作系统中的图形渲染。
📌 OpenGL ES 与桌面 OpenGL 的主要区别:
| 特性 | OpenGL | OpenGL ES |
|---|---|---|
| 目标平台 | 桌面/工作站 | 嵌入式/移动设备 |
| 固定管线 | 支持(旧版本) | 完全移除,仅支持可编程管线 |
| 着色语言 | GLSL(完整版) | GLSL ES(精简版) |
| 数据类型 | 更丰富(如 double) | 限制较多(通常只支持 float、int) |
| 状态管理 | 更复杂 | 更轻量、更严格 |
| 扩展机制 | 多而杂 | 统一通过 Khronos 标准化 |
🔢 OpenGL ES 主要版本:
OpenGL ES 1.0 / 1.1
- 基于固定功能管线(Fixed-function pipeline)
- 已基本淘汰
OpenGL ES 2.0(2007)
- 移除了固定管线,引入可编程着色器(Vertex & Fragment Shader)
- 使用 GLSL ES 1.00
- 广泛用于早期 Android/iOS 应用
OpenGL ES 3.0(2012)
- 新增:多渲染目标(MRT)、纹理压缩、实例化绘制、变换反馈等
- GLSL ES 3.00
- 要求 GPU 支持(如 Adreno 3xx、Mali-T6xx)
OpenGL ES 3.1(2014)
- 引入计算着色器(Compute Shader)
- 间接绘制、独立着色器对象等
OpenGL ES 3.2(2015)
- 整合 Android Extension Pack(AEP)
- 支持几何着色器、曲面细分(Tessellation)、ASTC 纹理压缩等
🧱 核心概念(以 GLES 2.0+ 为例):
着色器(Shader)
- 顶点着色器(Vertex Shader):处理顶点位置、法线等
- 片段着色器(Fragment Shader):计算每个像素颜色
程序对象(Program Object)
- 链接顶点和片段着色器后生成
缓冲区对象(Buffer Objects)
- VBO(Vertex Buffer Object):存储顶点数据
- IBO/EBO(Index Buffer Object):存储索引
纹理(Texture)
- 支持 2D、立方体贴图等,但不支持 3D 纹理(直到 ES 3.0)
帧缓冲(Framebuffer Object, FBO)
- 实现离屏渲染、后处理效果
状态机模型
- OpenGL ES 是一个巨大的状态机,需显式启用/绑定资源
📱 在 Android 中使用 OpenGL ES:
- 通过
GLSurfaceView或EGL+SurfaceTexture实现 - 需在
AndroidManifest.xml中声明:<uses-feature android:glEsVersion="0x00020000" android:required="true" /> - 渲染线程必须在 GL 线程中调用 API
⚠️ 注意事项:
- 没有 glBegin/glEnd:所有几何数据必须通过 VBO 提交
- 精度限定符:GLSL ES 中必须指定
highp/mediump/lowpprecision mediump float; varying mediump vec2 v_texCoord; - 纹理尺寸:通常要求是 2 的幂(POT),除非使用 NPOT 扩展(ES 2.0+ 一般支持)
- 深度/模板缓冲:需显式创建并附加到 FBO
🔗 学习资源:
- Khronos 官方文档
- 《OpenGL ES 3.0 Programming Guide》
- Android 官方指南:OpenGL ES Overview
- WebGL(基于 OpenGL ES 2.0/3.0)可用于 Web 端实验
如果你有具体问题,比如:
- 如何绘制一个三角形?
- 如何使用纹理?
- 如何在 Android 中初始化 OpenGL ES?
- 如何调试着色器?
欢迎继续提问!