目录
-
(图片来源网络,侵删)- 什么是 OpenGL ES?
- 为什么在 Android 上使用 OpenGL ES?
- 环境准备:Android Studio 和 NDK (可选)
- 关键概念:GPU、渲染管线、顶点、片段
-
- 创建
GLSurfaceView - 实现
GLSurfaceView.Renderer - 渲染管线详解:
onSurfaceCreated,onDrawFrame,onSurfaceChanged - 编译和运行你的第一个程序
- 创建
-
- 定义顶点数据
- 传递数据到 GPU (VBO - Vertex Buffer Object)
- 编写着色器 (顶点着色器 & 片段着色器)
- 使用着色器程序
- 绘制三角形
-
- 创建立方体的顶点和颜色数据
- 实现模型-视图-投影 矩阵
- 处理触摸事件实现旋转
- 完整代码示例
-
(图片来源网络,侵删)- 官方文档
- 书籍
- 在线教程和博客
第一部分:基础知识与环境准备
1 什么是 OpenGL ES?
- OpenGL (Open Graphics Library): 是一个跨语言、跨平台的图形 API,用于渲染 2D 和 3D 矢量图形。
- ES (for Embedded Systems): 是 OpenGL 的一个子集,专门为手机、游戏主机、嵌入式系统等资源受限的设备设计。
- 在 Android 上,我们主要使用 OpenGL ES 2.0, 3.0, 或 3.1,ES 2.0 是目前最广泛支持的版本,它引入了可编程渲染管线,这是现代图形编程的基础。
2 为什么在 Android 上使用 OpenGL ES?
- 高性能: 直接利用 GPU 进行并行计算,比在 CPU 上用软件模拟快几个数量级。
- 复杂视觉效果: 实现游戏、3D 建模、AR/VR、图像/视频处理等需要硬件加速的应用。
- 跨平台: OpenGL ES 标准在 Android 和 iOS 上都有良好支持。
3 环境准备
- Android Studio: 最新版本即可。
- NDK (Native Development Kit): 对于初学者,你不需要直接配置 NDK,你可以通过 Java/Kotlin 调用 OpenGL ES API,了解 NDK 是因为很多高级库(如游戏引擎)会用到它,我们本教程将使用纯 Java/Kotlin 方式。
4 关键概念
- GPU (Graphics Processing Unit): 图形处理器,专门执行图形相关计算的硬件。
- 渲染管线: 将 3D 模型数据转换成屏幕上 2D 像素的整个过程,它像一个工厂流水线,包含多个处理阶段。
- 固定功能管线 (旧版): 阶段是固定的,开发者只能配置参数。
- 可编程管线 (ES 2.0+): 开发者可以编写小程序(称为着色器)来控制顶点和片段的处理阶段,这提供了极大的灵活性。
- 顶点: 定义 3D 模型的角点,包含位置、颜色、纹理坐标等属性。
- 片段: 光栅化后,屏幕上的一个像素点对应的颜色数据。
第二部分:第一个 OpenGL ES 程序:渲染一个点
这是 "Hello, World!" 的 OpenGL 版本,目标是在屏幕中央画一个红点。
1 创建 GLSurfaceView
GLSurfaceView 是一个专门用于 OpenGL ES 渲染的 SurfaceView,它管理一个 OpenGL ES 上下文,并处理 EGL 的配置。
在 Activity 的布局文件 activity_main.xml 中:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.opengl.GLSurfaceView
android:id="@+id/gl_surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
在 MainActivity.java 中初始化它:

public class MainActivity extends AppCompatActivity {
private GLSurfaceView glSurfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
glSurfaceView = findViewById(R.id.gl_surface_view);
// 设置 OpenGL ES 版本
glSurfaceView.setEGLContextClientVersion(2); // 使用 OpenGL ES 2.0
// 设置渲染器
glSurfaceView.setRenderer(new MyGLRenderer());
// 设置渲染模式: RENDERMODE_WHEN_DIRTY 表示只有请求时才渲染
// 更流畅的动画可以使用 RENDERMODE_CONTINUOUSLY
glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
@Override
protected void onPause() {
super.onPause();
glSurfaceView.onPause();
}
@Override
protected void onResume() {
super.onResume();
glSurfaceView.onResume();
}
}
2 实现 GLSurfaceView.Renderer
Renderer 是核心接口,它定义了渲染管线的三个关键回调。
创建 MyGLRenderer.java:
public class MyGLRenderer implements GLSurfaceView.Renderer {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 当 GLSurfaceView 被创建时调用,只调用一次
// 设置清屏颜色为黑色
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// 当 GLSurfaceView 的几何形状(大小)改变时调用
// 设置视口
GLES20.glViewport(0, 0, width, height);
}
@Override
public void onDrawFrame(GL10 gl) {
// 每一帧绘制时调用
// 清除颜色缓冲区
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
}
}
运行一下,你应该看到一个黑色的屏幕,这很好,说明 OpenGL ES 环境已经搭建成功。
3 渲染管线详解
onSurfaceCreated(GL10 gl, EGLConfig config):- 作用: 初始化 OpenGL ES 环境,这里只调用一次。
- 做什么: 设置清除屏幕的颜色 (
glClearColor),启用/禁用功能(如深度测试、混合等),编译着色器程序等。
onSurfaceChanged(GL10 gl, int width, int height):- 作用: 当屏幕方向改变或窗口大小改变时被调用。
- 做什么: 设置视口 (
glViewport),它定义了 OpenGL 的绘图区域将如何映射到屏幕的像素上,通常设置为整个屏幕。
onDrawFrame(GL10 gl):- 作用: 每一帧都会被调用,是执行所有绘图命令的地方。
- 做什么: 清除屏幕 (
glClear),设置模型/视图/投影矩阵,绑定着色器程序,绘制图形等。
第三部分:绘制你的第一个几何图形:三角形
我们用可编程管线来画一个彩色三角形。
1 定义顶点数据
我们需要定义三角形的三个顶点,每个顶点包含位置 (x, y, z) 和颜色 (r, g, b, a)。
// 顶点坐标的 XYZW (W=1.0f)
final float[] triangleVertices = {
0.0f, 0.5f, 0.0f, // 顶点 0 (上)
-0.5f, -0.5f, 0.0f, // 顶点 1 (左下) 