杰瑞科技汇

opengl android 教程

目录

  1. 第一部分:基础知识与环境准备

    opengl android 教程-图1
    (图片来源网络,侵删)
    • 什么是 OpenGL ES?
    • 为什么在 Android 上使用 OpenGL ES?
    • 环境准备:Android Studio 和 NDK (可选)
    • 关键概念:GPU、渲染管线、顶点、片段
  2. 第二部分:第一个 OpenGL ES 程序:渲染一个点

    • 创建 GLSurfaceView
    • 实现 GLSurfaceView.Renderer
    • 渲染管线详解:onSurfaceCreated, onDrawFrame, onSurfaceChanged
    • 编译和运行你的第一个程序
  3. 第三部分:绘制你的第一个几何图形:三角形

    • 定义顶点数据
    • 传递数据到 GPU (VBO - Vertex Buffer Object)
    • 编写着色器 (顶点着色器 & 片段着色器)
    • 使用着色器程序
    • 绘制三角形
  4. 第四部分:进阶 - 绘制一个可交互的彩色立方体

    • 创建立方体的顶点和颜色数据
    • 实现模型-视图-投影 矩阵
    • 处理触摸事件实现旋转
    • 完整代码示例
  5. 第五部分:推荐资源与后续学习

    opengl android 教程-图2
    (图片来源网络,侵删)
    • 官方文档
    • 书籍
    • 在线教程和博客

第一部分:基础知识与环境准备

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 中初始化它:

opengl android 教程-图3
(图片来源网络,侵删)
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 (左下)
分享:
扫描分享到社交APP
上一篇
下一篇