👋 你好,欢迎来到我的博客!我是【菜鸟不学编程】
   我是一个正在奋斗中的职场码农,步入职场多年,正在从“小码农”慢慢成长为有深度、有思考的技术人。在这条不断进阶的路上,我决定记录下自己的学习与成长过程,也希望通过博客结识更多志同道合的朋友。
  
  🛠️ 主要方向包括 Java 基础、Spring 全家桶、数据库优化、项目实战等,也会分享一些踩坑经历与面试复盘,希望能为还在迷茫中的你提供一些参考。
  💡 我相信:写作是一种思考的过程,分享是一种进步的方式。
  
   如果你和我一样热爱技术、热爱成长,欢迎关注我,一起交流进步!

概述:OpenGL ES 的基本概念

OpenGL ES(Open Graphics Library for Embedded Systems)是一个为嵌入式设备(如移动设备、嵌入式系统和游戏机)设计的图形渲染 API,它提供了2D和3D图形的渲染功能。OpenGL ES 是 OpenGL 的一个简化版本,专门为低功耗设备和嵌入式设备设计,支持高效的图形渲染和处理。

OpenGL ES 的基本特点:

  1. 跨平台:OpenGL ES 可以在不同的嵌入式设备和操作系统上运行,提供一致的图形渲染接口。
  2. 硬件加速:OpenGL ES 支持硬件加速的图形渲染,能够充分利用设备的 GPU 来提高性能。
  3. 支持 2D 和 3D 渲染:OpenGL ES 提供了强大的 3D 图形渲染功能,也能用于渲染 2D 图形。
  4. 可编程流水线:OpenGL ES 支持着色器编程,开发者可以通过编写顶点着色器和片段着色器来控制图形的渲染过程。

在鸿蒙(HarmonyOS)中,图形渲染主要通过集成 OpenGL ES 或 Vulkan 实现。鸿蒙提供了强大的图形接口和 API 来支持 2D 和 3D 图形渲染。


使用 OpenGL ES 渲染 2D/3D 图形

在鸿蒙中,开发者可以使用 OpenGL ES 来渲染 2D 或 3D 图形。通过创建一个 OpenGL ES 环境,可以使用 GLSurfaceView 类进行图形绘制。通过顶点着色器和片段着色器,开发者可以自定义图形的渲染过程。

1. 初始化 OpenGL ES 环境

要在鸿蒙应用中使用 OpenGL ES,首先需要初始化 OpenGL ES 环境,并设置渲染的上下文。通过 GLSurfaceView,我们可以将渲染结果显示到屏幕上。

import ohos.agp.components.GLSurfaceView;
import ohos.agp.render.opengl.GLContext;
import ohos.agp.render.opengl.GLSurfaceView.Renderer;

public class MyGLRenderer implements Renderer {

    @Override
    public void onSurfaceCreated(GLContext glContext) {
        // 在这里初始化 OpenGL 设置,如背景色、启用深度测试等
        glContext.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);  // 设置背景色
        glContext.glEnable(GLContext.GL_DEPTH_TEST);      // 启用深度测试
    }

    @Override
    public void onDrawFrame(GLContext glContext) {
        // 清除缓冲区并绘制图形
        glContext.glClear(GLContext.GL_COLOR_BUFFER_BIT | GLContext.GL_DEPTH_BUFFER_BIT);
        // 绘制代码:在这里绘制 2D 或 3D 图形
    }

    @Override
    public void onSurfaceChanged(GLContext glContext, int width, int height) {
        // 处理屏幕大小变化
        glContext.glViewport(0, 0, width, height);
    }

    @Override
    public void onSurfaceDestroyed(GLContext glContext) {
        // 释放 OpenGL 资源
    }
}

解释:

  • onSurfaceCreated():用于初始化 OpenGL 环境,设置背景色、启用深度测试等。
  • onDrawFrame():每一帧渲染时调用的函数,用于绘制图形。这里可以编写绘制 2D 或 3D 图形的代码。
  • onSurfaceChanged():处理视口大小的变化,当屏幕大小发生变化时需要更新视口。
  • onSurfaceDestroyed():销毁 OpenGL 环境,释放资源。
2. 渲染 2D 图形

在 OpenGL ES 中,渲染 2D 图形通常通过绘制矩形、圆形、线条等基础图形来实现。以下是一个简单的渲染矩形的示例。

import ohos.agp.render.opengl.GLContext;
import ohos.agp.render.opengl.GLSurfaceView;

public class RectangleRenderer implements GLSurfaceView.Renderer {

    private float[] vertices = {
        -0.5f,  0.5f, 0.0f,  // 左上角
        -0.5f, -0.5f, 0.0f,  // 左下角
         0.5f, -0.5f, 0.0f,  // 右下角
         0.5f,  0.5f, 0.0f   // 右上角
    };

    private float[] color = { 0.0f, 1.0f, 0.0f, 1.0f };  // 设置矩形颜色为绿色

    @Override
    public void onSurfaceCreated(GLContext glContext) {
        glContext.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);  // 设置背景颜色
        glContext.glEnable(GLContext.GL_DEPTH_TEST);  // 启用深度测试
    }

    @Override
    public void onDrawFrame(GLContext glContext) {
        glContext.glClear(GLContext.GL_COLOR_BUFFER_BIT | GLContext.GL_DEPTH_BUFFER_BIT);
        
        // 绘制矩形
        glContext.glBegin(GLContext.GL_QUADS);  // 使用四边形绘制矩形
        glContext.glColor4f(color[0], color[1], color[2], color[3]);
        
        // 绘制矩形的四个顶点
        for (int i = 0; i < vertices.length; i += 3) {
            glContext.glVertex3f(vertices[i], vertices[i + 1], vertices[i + 2]);
        }
        
        glContext.glEnd();
    }

    @Override
    public void onSurfaceChanged(GLContext glContext, int width, int height) {
        glContext.glViewport(0, 0, width, height);  // 设置视口大小
    }

    @Override
    public void onSurfaceDestroyed(GLContext glContext) {
        // 释放资源
    }
}

解释:

  • 通过 glBegin(GLContext.GL_QUADS)glEnd() 来绘制一个矩形,glVertex3f() 设置矩形的四个顶点。
  • glColor4f() 设置矩形的颜色为绿色。
3. 渲染 3D 图形

OpenGL ES 也可以用来渲染 3D 图形,通常需要进行视图变换、投影变换等操作来实现三维图形的渲染。

import ohos.agp.render.opengl.GLContext;
import ohos.agp.render.opengl.GLSurfaceView;

public class CubeRenderer implements GLSurfaceView.Renderer {

    private float[] vertices = {
        -0.5f, -0.5f, -0.5f, // 后面左下角
         0.5f, -0.5f, -0.5f, // 后面右下角
         0.5f,  0.5f, -0.5f, // 后面右上角
        -0.5f,  0.5f, -0.5f, // 后面左上角
        -0.5f, -0.5f,  0.5f, // 前面左下角
         0.5f, -0.5f,  0.5f, // 前面右下角
         0.5f,  0.5f,  0.5f, // 前面右上角
        -0.5f,  0.5f,  0.5f  // 前面左上角
    };

    private byte[] indices = {
        0, 1, 2,  0, 2, 3,  // 后面面
        4, 5, 6,  4, 6, 7,  // 前面面
        0, 1, 5,  0, 5, 4,  // 底面
        2, 3, 7,  2, 7, 6,  // 顶面
        0, 3, 7,  0, 7, 4,  // 左面
        1, 2, 6,  1, 6, 5   // 右面
    };

    @Override
    public void onSurfaceCreated(GLContext glContext) {
        glContext.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);  // 设置背景颜色
        glContext.glEnable(GLContext.GL_DEPTH_TEST);  // 启用深度测试
    }

    @Override
    public void onDrawFrame(GLContext glContext) {
        glContext.glClear(GLContext.GL_COLOR_BUFFER_BIT | GLContext.GL_DEPTH_BUFFER_BIT);
        
        // 绘制 3D 立方体
        glContext.glBegin(GLContext.GL_TRIANGLES);  // 绘制三角形

        for (int i = 0; i < indices.length; i += 3) {
            int index1 = indices[i] * 3;
            int index2 = indices[i + 1] * 3;
            int index3 = indices[i + 2] * 3;

            glContext.glVertex3f(vertices[index1], vertices[index1 + 1], vertices[index1 + 2]);
            glContext.glVertex3f(vertices[index2], vertices[index2 + 1], vertices[index2 + 2]);
            glContext.glVertex3f(vertices[index3], vertices[index3 + 1], vertices[index3 + 2]);
        }

        glContext.glEnd();
    }

    @Override
    public void onSurfaceChanged(GLContext glContext, int width, int height) {
        glContext.glViewport(0, 0, width, height);  // 设置视口大小
    }

    @Override
    public void onSurfaceDestroyed(GLContext glContext) {
        // 释放资源
    }
}

解释:

  • 通过 glBegin(GLContext.GL_TRIANGLES)glEnd() 来绘制 3D 立方体,glVertex3f() 设置每个三角形的顶点。
  • 通过变换矩阵(视图变换和投影变换)可以将 3D 图形呈现到 2D 屏幕上。

总结

通过集成 OpenGL ES,鸿蒙应用能够高效地进行 2D 和 3D 图形的渲染。开发者可以自定义渲染过程,包括设置顶点、绘制图形、处理变换和光照等。通过 GLSurfaceView 和 OpenGL 的 API,可以轻松实现图形渲染、动画效果等,满足高性能和多样化的图形需求。

📝 写在最后

如果你觉得这篇文章对你有帮助,或者有任何想法、建议,欢迎在评论区留言交流!你的每一个点赞 👍、收藏 ⭐、关注 ❤️,都是我持续更新的最大动力!

我是一个在代码世界里不断摸索的小码农,愿我们都能在成长的路上越走越远,越学越强!

感谢你的阅读,我们下篇文章再见~👋

✍️ 作者:某个被流“治愈”过的 Java 老兵
📅 日期:2025-07-25
🧵 本文原创,转载请注明出处。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐