- 简介
- 总体路线(先有全局感)
- 基础
- OpenGL ES 核心 API(能画出东西)
- 坐标 & 变换(开始有空间感)
- 纹理 & 图片渲染(开始实用)
- Android 实战
- 进阶(真正有含金量)
- 高级(区分高手)
- Android 特有重点(很多人忽略)
- OpenGL ES 2.0 / 3.0 区别(必须知道)
- 推荐学习顺序(最重要)
- 小项目驱动
- 学习资源
简介
OpenGL(Open Graphics Library)是一个跨语言、跨平台的工业级三维图形API规范,用于渲染2D和3D矢量图形。它不是一个具体代码库,而是由 Khronos Group 制定的一套严格的技术标准,由GPU硬件厂商开发对应实现,广泛应用于游戏开发、CAD、科学可视化和虚拟现实。
- OpenGL ES (OpenGL for Embedded Systems): 针对手机、掌机等嵌入式设备设计的子集,去除了一些繁杂功能,确保在移动端的高效运行。
- WebGL: 基于 OpenGL ES,用于在网页浏览器中渲染3D图形。
总体路线(先有全局感)
核心学习路径: 图形学基础 → OpenGL ES 基础 → Android 集成 → Shader → 渲染管线 → 高级效果 → 实战优化
基础
- 图形学最基础概念
这些一定要理解(不用太深,但要“能画图解释”): • 坐标系(屏幕坐标 / 世界坐标 / NDC) • 向量 & 矩阵(重点) • 变换: • 平移(translate) • 旋转(rotate) • 缩放(scale)
👉 核心公式(非常重要):
\[\mathbf{v’} = M \cdot \mathbf{v}\]-
渲染管线(必须理解流程) OpenGL 本质是: 顶点 → 顶点着色器 → 图元装配 → 光栅化 → 片元着色器 → 屏幕 👉 你至少要知道: • 顶点(Vertex)是什么 • 片元(Fragment)是什么 • Shader 在干嘛
-
Buffer 体系 GPU 数据存储: • VBO(顶点缓冲) • IBO / EBO(索引缓冲) • VAO(ES 3.0)
OpenGL ES 核心 API(能画出东西)
Android 上的入口
你会用到: • GLSurfaceView • Renderer
class MyRenderer : GLSurfaceView.Renderer {
override fun onSurfaceCreated(...)
override fun onDrawFrame(...)
}
- 第一个三角形(必须自己写)
这是 OpenGL 的“Hello World”:
你要掌握: • 创建 Shader • 编译 Shader • 链接 Program • 传入顶点数据 • 调用 draw
- Shader(重点中的重点)
Shader 的本质 = 数据如何在 GPU 流动 语言是: GLSL(OpenGL Shading Language)
Shader 数据传递机制,明确这三个概念:
attribute // 顶点输入(ES 2.0)
uniform // 全局变量(CPU → GPU)
varying // 顶点 → 片元传递
2.1 顶点着色器(Vertex Shader)
attribute vec4 vPosition;
void main() {
gl_Position = vPosition;
}
2.2 片元着色器(Fragment Shader)
precision mediump float;
void main() {
gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}
⚠️ 关键理解: 👉 Shader = GPU 上跑的程序 👉 你写的是“如何画”,不是“画什么”
坐标 & 变换(开始有空间感)
-
坐标 1️⃣ 模型坐标(Model Space) 2️⃣ 世界坐标(World Space) 3️⃣ 观察坐标(View Space) 4️⃣ 裁剪坐标(Clip Space) 5️⃣ NDC(-1 ~ 1) 6️⃣ 屏幕坐标
-
MVP 矩阵(超级核心)
MVP = Projection * View * Model 模型 → 世界 → 相机 → 屏幕
- 相机系统
你要理解: • 相机其实是“反向移动世界” • lookAt 的本质
纹理 & 图片渲染(开始实用)
- 纹理(Texture)
纹理本质:纹理 = 一个函数
color = texture2D(texture, uv)
你会学到: • 加载 Bitmap → GPU • 纹理坐标(UV),UV 不是坐标,而是“查表索引”
Android 实战
典型应用: • 图片滤镜 • 视频渲染(SurfaceTexture) • Camera 预览
进阶(真正有含金量)
- FrameBuffer(离屏渲染)
👉 非常重要: • 做滤镜链 • 做特效 • 做截图
- 多重 Shader 效果
比如: • 美颜 • 模糊(高斯模糊) • LUT 调色
- Blend(混合)
glEnable(GL_BLEND)
用来做: • 透明 • UI叠加 • 粒子效果
- 深度测试(3D 必备)
glEnable(GL_DEPTH_TEST)
高级(区分高手)
-
性能优化 • 减少 draw call • VBO / VAO • 批处理 • 纹理复用
-
高级效果 • 粒子系统 • 阴影 • 光照模型(Phong / PBR) • 后处理(Bloom / HDR)
-
调试能力 调试工具: • glGetError()(基础) • GPU Inspector(Android) • RenderDoc(神器)
👉 不会调试 = 永远卡黑屏
Android 特有重点(很多人忽略)
-
SurfaceTexture(相机 / 视频) • Camera → OpenGL • 视频解码 → 渲染
-
EGL(底层机制) 负责: • 创建 OpenGL 上下文 • 绑定 Surface
-
生命周期 • onSurfaceCreated • onSurfaceChanged • onDrawFrame
-
线程模型 OpenGL 在 Android 上最容易踩坑的点: • GL 只能在 GLThread 操作 • 不能在主线程乱调 GL • GLSurfaceView 内部有独立线程
OpenGL ES 2.0 / 3.0 区别(必须知道)
Android 主流是: • ES 2.0(最基础,兼容性最好) • ES 3.0+(现代能力) 初学建议用 ES 2.0(理解本质),进阶必须转 ES 3.0
推荐学习顺序(最重要)
按这个顺序走,不会迷路:
🥇 第1周 • 三角形 • Shader 基础 • 理解 pipeline 👉 目标:屏幕出东西
🥈 第2周 • MVP • 相机 • 坐标系 👉 目标:物体能动
🥉 第3周 • 纹理 • 图片渲染 • FBO 👉 目标:能做滤镜
🎮 第4周 • SurfaceTexture • Camera • 视频 👉 目标:接入真实数据流
🚀 第5周
• 滤镜
• FBO(FBO = 一切特效的基础,不会 FBO = 基本不会做图像处理)具体场景:
• 滤镜链(抖音、美颜)
• 截图
• 离屏渲染 UI
• 多 Pass 渲染
👉 目标:加入特效
🚀 第6周 • 多Pass渲染 • 性能优化 • 光照 / 3D 👉 目标:接近引擎能力
小项目驱动
比如: 1. 图片灰度滤镜 2. 相机预览 + 美颜 3. 多滤镜切换 4. 简单粒子系统
👉 原因很现实:不做项目 = 永远觉得自己“会了但不会用”
学习资源
- learnopengl(经典教程)
- 英文版:http://learnopengl.com/
- 中文版:https://learnopengl-cn.github.io/
- 中文版(deprecated):https://learnopengl-cn.readthedocs.io/zh/latest/
- B 站视频:https://www.bilibili.com/video/BV1Sv411g7pp/
- Android OpenGL 官方 sample
- https://developer.android.google.cn/develop/ui/views/graphics/opengl?hl=zh-cn
- https://developer.android.com/reference/android/opengl/package-summary
- docs.gl(OpenGL API 字典)
- shader toy(在线玩 shader)
- OpenGL ES Shading Language Specification
- 字节流动公众号 OpenGL 系列文章
- 字节流动公众号 OpenGL 系列文章
- Android OpenGL ES 系列连载:(01)绘制一个三角形
- Android OpenGL ES 系列连载:(02)纹理映射
- Android OpenGL ES 系列连载:(03)YUV 渲染
- Android OpenGL ES 系列连载:(04)VBO、EBO 和 VAO
- Android OpenGL ES 系列连载:(05)FBO 离屏渲染
- Android OpenGL ES 系列连载:(06)EGL
- Android OpenGL ES 系列连载:(07)Transform Feedback
- Android OpenGL ES 系列连载:(08)坐标系统
- Android OpenGL ES 系列连载:(09)光照基础
- Android OpenGL ES 系列连载:(10)深度测试
- Android OpenGL ES 系列连载:(11)模板测试
- Android OpenGL ES 系列连载:(12)混合
- Android OpenGL ES 系列连载:(13)实例化(Instancing)
- Android OpenGL ES 系列连载:(14)粒子(Particles)
- Android OpenGL ES 系列连载:(15)立方体贴图(天空盒)
- Android OpenGL ES 系列连载:(16)相机预览
- Android OpenGL ES 系列连载:(17)相机基础滤镜
- Android OpenGL ES 系列连载:(18)相机 LUT 滤镜
- Android OpenGL ES 系列连载:(19)相机抖音滤镜
- Android OpenGL ES 系列连载:(20)3D 模型
- Android OpenGL ES 系列连载:(21)3D 模型加载和渲染
- Android OpenGL ES 系列连载:(22)PBO
- OpenGL ES 3.0 开发(23):多重渲染目标(MRT)
- OpenGL ES 3.0 开发(24):帧缓冲区位块传送(Blit)
- OpenGL ES 3.0 开发(25):TBO(GLES 3.1)
- OpenGL ES 实现动态(水波纹)涟漪效果
- OpenGL ES 实现 3D 阿凡达效果
- OpenGL ES 实现刮刮卡和手写板功能
- OpenGL ES 实现实时音频的可视化
- OpenGL ES 实现头部形变和头部晃动效果
- OpenGL ES 实现瘦脸大眼效果
- OpenGL ES 绘制贝塞尔曲线
- OpenGL ES 实现瘦身大长腿效果
- OpenGL ES 实现心动特效
- github NDK_OpenGLES_3_0
- GLSL 中文手册