OpenGL

Posted on By ᵇᵒ

简介

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 → 渲染管线 → 高级效果 → 实战优化

基础

  1. 图形学最基础概念

这些一定要理解(不用太深,但要“能画图解释”): • 坐标系(屏幕坐标 / 世界坐标 / NDC) • 向量 & 矩阵(重点) • 变换: • 平移(translate) • 旋转(rotate) • 缩放(scale)

👉 核心公式(非常重要):

\[\mathbf{v’} = M \cdot \mathbf{v}\]
  1. 渲染管线(必须理解流程) OpenGL 本质是: 顶点 → 顶点着色器 → 图元装配 → 光栅化 → 片元着色器 → 屏幕 👉 你至少要知道: • 顶点(Vertex)是什么 • 片元(Fragment)是什么 • Shader 在干嘛

  2. 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(...)
}
  1. 第一个三角形(必须自己写)

这是 OpenGL 的“Hello World”:

你要掌握: • 创建 Shader • 编译 Shader • 链接 Program • 传入顶点数据 • 调用 draw

  1. 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. 坐标 1️⃣ 模型坐标(Model Space) 2️⃣ 世界坐标(World Space) 3️⃣ 观察坐标(View Space) 4️⃣ 裁剪坐标(Clip Space) 5️⃣ NDC(-1 ~ 1) 6️⃣ 屏幕坐标

  2. MVP 矩阵(超级核心)

MVP = Projection * View * Model 模型 → 世界 → 相机 → 屏幕

  1. 相机系统

你要理解: • 相机其实是“反向移动世界” • lookAt 的本质

纹理 & 图片渲染(开始实用)

  1. 纹理(Texture)

纹理本质:纹理 = 一个函数

color = texture2D(texture, uv)

你会学到: • 加载 Bitmap → GPU • 纹理坐标(UV),UV 不是坐标,而是“查表索引”

Android 实战

典型应用: • 图片滤镜 • 视频渲染(SurfaceTexture) • Camera 预览

进阶(真正有含金量)

  1. FrameBuffer(离屏渲染)

👉 非常重要: • 做滤镜链 • 做特效 • 做截图

  1. 多重 Shader 效果

比如: • 美颜 • 模糊(高斯模糊) • LUT 调色

  1. Blend(混合)
glEnable(GL_BLEND)

用来做: • 透明 • UI叠加 • 粒子效果

  1. 深度测试(3D 必备)
glEnable(GL_DEPTH_TEST)

高级(区分高手)

  1. 性能优化 • 减少 draw call • VBO / VAO • 批处理 • 纹理复用

  2. 高级效果 • 粒子系统 • 阴影 • 光照模型(Phong / PBR) • 后处理(Bloom / HDR)

  3. 调试能力 调试工具: • glGetError()(基础) • GPU Inspector(Android) • RenderDoc(神器)

👉 不会调试 = 永远卡黑屏

Android 特有重点(很多人忽略)

  1. SurfaceTexture(相机 / 视频) • Camera → OpenGL • 视频解码 → 渲染

  2. EGL(底层机制) 负责: • 创建 OpenGL 上下文 • 绑定 Surface

  3. 生命周期 • onSurfaceCreated • onSurfaceChanged • onDrawFrame

  4. 线程模型 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. 简单粒子系统

👉 原因很现实:不做项目 = 永远觉得自己“会了但不会用”

学习资源