使用Android OpenGL ES 2.0绘图之一:搭建一个OpenGL ES环境

ARCore:OpenGL ES环境搭建 估计大部分Anroid开发的同学,对OpenGL ES的了解可能也仅仅停留在三维图形的渲染,入门模板代码的编写阶段。在ARCore开发中,如果你选择使用Android+OpenGL ES的开发技术栈,就需要大家深入的学习和了解OpenGL ES技术了。那么接下来我们就分如下主题和大家来唠唠: 一、OpenGL ES概述 1. Open GL是做什么的? 高效、简洁的开放图形库接口, 阅读详情

传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.youkuaiyun.com/leverage_1229

        为了能够在Android应用程序中使用OpenGL ES绘制图形,你必须创建一个视图作为容器。而更直接的做法是从GLSurfaceView和 GLSurfaceView.Renderer各派生一个实现类。GLSurfaceView作为使用OpenGL绘制的容器,GLSurfaceView.Renderer将用于控制绘图的动作。对这些类的更多信息,请参阅OpenGL ES开发人员指南。

        使用GLSurfaceView几乎是整合OpenGL ES到你的应用中的唯一方式。对于一个需要全屏或近乎屏幕图形视图,它是一个合理的选择。如果开发人员只是期望借助OpenGL ES在某个布局中一小部分绘图,则应该考虑使用TextureView。如果觉得自己是“大牛”,完全可以使用SurfaceView建立一个OpenGL ES视图,但这样做需要编写相当多的额外的代码。
        这一节将介绍如何在一个简单应用的activity中完成一个最小的GLSurfaceView和GLSurfaceView.Renderer的实现。

1在Manifest文件中声明使用OpenGL ES

        为了能够使用OpenGL ES 2.0 API,你必须在manifest文件中添加以下声明:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
        如果你的应用需要使用纹理压缩功能,还要声明设备需要支持什么样的压缩格式:
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
        更多关于纹理压缩格式的信息,请参阅OpenGL开发人员指南。

2为OpenGL ES图形创建一个Activity

        这个Activity跟任何其他的应用程序中的Activity一样,也有一个用户界面。唯一的区别是在它的布局文件中存放的视图不是TextView、Button和ListView,而是一个GLSurfaceView。
        下面的代码演示了使用GLSurfaceView作为主视图的Acitivity的核心代码:
public class OpenGLES20 extends Activity {

    private GLSurfaceView mGLView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 创建一个GLSurfaceView对象,并将其设置为当前Activity的ContentView
        mGLView = new MyGLSurfaceView(this);
        setContentView(mGLView);
    }
}
        注:OpenGL ES 2.0需要Android2.2 (API Level 8) 及以上版本,所以请确保你的Android项目的运行目标的API等级不低于8或更高。

3构造一个GLSurfaceView对象

        事实上GLSurfaceView并没有提供很多功能,实际上绘制对象的任务都在GLSurfaceView.Renderer中进行。所以GLSurfaceView中代码也非常少,甚至可以直接使用GLSurfaceView。但最好别这样做,因为你需要扩展这个类来响应触摸事件。
        通常在当前Activity中以内部类的方式创建GLSurfaceView,这样实现起来非常快,核心代码如下:
class MyGLSurfaceView extends GLSurfaceView {

    public MyGLSurfaceView(Context context){
        super(context);

        // 设置渲染对象,用于控制在GLSurfaceView中的绘制工作
        setRenderer(new MyRenderer());
    }
}
        当使用OpenGL ES 2.0时,你必须在GLSurfaceView构造器中调用另外一个方法,它指定了你将要使用2.0版的API:
// 创建一个OpenGL ES 2.0 context
setEGLContextClientVersion(2);
        注:如果你使用的是OpenGL ES 2.0的API,那么请确保在Manifest文件中作出相关API版本声明。有关更多信息,请参见在Manifest文件中声明使用OpenGL ES。
        另一个可以添加到你的GLSurfaceView中可选操作是设置渲染模式为仅当绘制数据发生改变时才绘制view。该渲染模式常量是GLSurfaceView.RENDERMODE_WHEN_DIRTY。
// 只有在绘制数据改变时才绘制view
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
        该设置可以防止GLSurfaceView帧重绘,直到调用requestRender()方法。这样的绘制机制更高效。

4构造一个Renderer类

        Renderer类负责控制在GLSurfaceView中绘制任务,并提供三个回调方法供Android系统调用,用来计算在GLSurfaceView中绘制什么以及如何绘制。
4.1onSurfaceCreated():仅调用一次,用于设置view的OpenGL ES环境。
4.2onDrawFrame():每次重绘view时调用。
4.3onSurfaceChanged():当view的几何形状发生变化时调用,比如设备从竖屏变为横屏。
        下面是一个OpenGL ES renderer的最基本的实现,仅在GLSurfaceView上画了一个灰色的背景:
public class MyGL20Renderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        // 设置背景色
        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    }

    public void onDrawFrame(GL10 unused) {
        // 重绘背景色
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    }

    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
    }
}
        以上就是所有要做的东西!上面的代码示例创建了一个简单的Android应用,它使用OpenGL显示了一个灰色的屏幕。虽然这段代码并没有做什么有趣的事情,但是通过创建这些类,已经为你使用OpenGL绘制图形奠定了基础。
        注:当你使用OpengGLES 2.0 API时,可以不用去明白这些方法们为什么都有一个GL10参数。其实这样做的目的是让Android框架能够简单的兼容OpenGL ES的各版本。
        如果你对OpenGL ES API很熟悉,你现在应该能够在应用程序中建立一个OpenGL ES环境并开始绘制图形了。然而,如果你想要学习更多的相关知识,那么就请继续关注下一节吧。
OpenGL ES 2.0 for Android教程(一) 本文是一系列OpenGL ES 2.0 for Android教程,基于Kotlin与一点点Compose来创建代码示例。通过本系列教程你可以从零开始一步步学习OpenGL ES。 阅读详情

相关推荐

如何在Android上使用OpenGL ES 2.0绘制点。

如何在Android使用OpenGL ES 2.0绘制点,看上去并不是一个复杂的问题,但是上网一搜,满眼都是绘制点的代码。 如果你看到类似如下代码,基本上你已经掉坑里了。   glBeging();  ...  glDrawPoint(...);  ...  glEnd(); 如上是使用OpenGL ES 1.0绘制点的代码。因为架构不同,在OPENGL ES 2.0的世界里

专栏 5006

学习OpenGL ES for Android(一)

OpenGL是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API),而在嵌入式和移动平台的版本是OpenGL ES。Android最初就支持OpenGL ES的1.0版本,到现在已经支持到最新的3.2版本,下面的支持变化图 当然这个版本支持不是绝对的,还有看硬件是否支持,例如genymotion模拟器只有OpenGL ES 2.0版本,如果你使用了高版本的API会导致崩溃。...

chends 1602

Android studio中使用opengl es绘图

首先是使用android studio生成空白的模板文件,包含一个MainActivity文件, 在onCreate方法中参照如下注释进行修改 package com.example.wang.androiddemo; import android.opengl.GLSurfaceView; import android.support.v7.app.AppCompatActivity; i

wangrl的博客 2467

Android OpenGL ES 3.0开发实战(01):Android OpenGL ES 3.0 Native开发环境搭建

Android OpenGL ES 3.0开发实战

Scott_S的博客 2675

CameraFilter, 研究 Android 用 OpenGL ES 2.0 处理相机预览和滤镜。.zip

CameraFilter, 研究 Android 用 OpenGL ES 2.0 处理相机预览和滤镜。

android opengl 立方体绘制并渲染 程序源代码

根据本人工作整理,因为本人在初学android OpenGL时走了很多弯路。所以抽时间整理了一下。分享给初学android OpenGL的朋友。希望朋友们能够少走弯路。代码注释详细,清晰。

OpenGL ES-GLSurfaceView绘制三角形、正方形

Openg ES、GLSurfaceView

SammeryD的博客 758

哈哈镜特效

可以随意添加自己的照片,查看自己在哈哈镜中的笑果。另外加了个判断窗体是否打开的功能。

OpenGL ES2.0 初步

最近工作要用到OpenGL的技术,现在开始学习一些OpenGL  ES的基础知识,并记录。 所有参考:   Android入门(4)OpenGL ES编程环境搭建  http://blog.csdn.net/silangquan/article/details/7938332 一步一步学android OpenGL ES2.0编程(1)http://blog.csdn.n

967

2017-10-27 在以前的代码中加入了opengl ES2.0显示点云的功能,代码毫无保留的分享给大家

2017-10-27 在以前的代码中加入了opengl ES2.0显示点云的功能,代码毫无保留的分享给大家,下载完了不会用的联系我。

Openggl 红宝书 在Qt 5.3 下运行的源代码

Openggl 红宝书的源代码,可以在 Migwin,Qt 5.3 下运行。

[OpenGL]从零开始写一个Android平台下的全景视频播放器——1.2 用OpenGL ES 2.0画一个三角形

Github项目地址,欢迎star~!为了方便没有准备好梯子的同学,我把项目在优快云上打包下载,不过更新会慢一些回到目录初始化OpenGL ES环境OpenGL ES的使用,一般包括如下几个步骤: 1. EGL Context初始化 2. OpenGL ES初始化 3. OpenGL ES设置选项与绘制 4. OpenGL ES资源释放(可选) 5

Martin的博客 5823

【数据分析与挖掘实战】金融风控之贷款违约预测详解1(有代码和数据集)

金融风控一.题目理解1.1.题目概况1.2数据概况1.3预测指标二.数据来源三.查看数据四.分类指标计算示例4.1混淆矩阵4.2准确度4.3precision(精确度),recall(召回率),f1-score4.4P-R曲线4.5ROC曲线4.6AUC曲线4.7KS值五.数据分析5.1基本信息5.2查看数据集中特征缺失值,唯一值等5.3查看特征的数值类型有哪些,对象类型有哪些5.3.1数值连续型变量分析5.3.2非数值类别型变量分析5.3.3总结:5.4变量分布可视化5.4.1单一变量分布可视化 更新中~

m0_49263811的博客 1万+

Android开发OpenGL ES 3.0搭建环境C++,基于CMake 3.4.1

目录 写在前面:假定读者已经能够实现一个Android的Include C++ support 的 Hello world程序 1、首先,准备IDE环境 2、CMakeList中加入必要的动态库 3、在C++文件中写上必要的代码,打包试验 虽然说Android提供了GLSurfaceView,但是在java层有诸多性能上的限制,在我苦苦寻找了三个礼拜之后,发现只需要加三行代码,环境就有了...

qiguangyaolove的博客 3035

向量库深度解析:选型、索引原理与生产实践

本文系统解析五大主流向量库(pgvector、Milvus、Weaviate、ChromaDB、Faiss)的定位、优缺点与适用场景,深入拆解FLAT、IVF、HNSW等核心索引原理,并重点分析Milvus的Compaction机制。针对数据治理场景,提供精准选型建议:中小规模优先pgvector或Weaviate,超大规模选择Milvus,开发测试推荐ChromaDB。核心索引推荐HNSW,兼顾检索速度与召回率。全文从理论到实践,为开发者提供清晰的向量库选型逻辑与生产落地指南。

a123147abc的博客 360

免安装版Notepad++终极配置:右键菜单+图标美化+多文件批量处理(2024新版)

本文详细介绍了如何为免安装版Notepad++进行终极配置,包括右键菜单添加、图标美化以及多文件批量处理功能。通过注册表编辑和高级定制,用户可以在便携版中实现与安装版相同的功能体验,同时保持系统整洁。特别适合开发者、系统管理员和效率追求者使用。

nut55的博客 830

OpenGL ES 2.0 Shader总结

自从Android 2.2启用了OpenGL ES 2.0之后,Android上图形开发就进入了GLSL(OpenGL Shader Language)时代;现今Vulkan以无可阻挡的大势将取代OpenGL,本人从PC上OpenGL开发到Android OpenGL ES Shader,和OpenGL已经打了数年交到(虽说中间断断续续,还不务正业搞多媒体),在OpenGL落幕之际,写篇OpenGL

矩阵实验室 5485

《探秘 BME680温度湿度气压气体传感器模块:环境感知的卓越之选》:此文为AI自动生成

BME680 是一款由博世公司推出的集成环境传感器模块,在环境监测和物联网等领域中发挥着重要作用。它能够同时测量温度、湿度、气压和气体浓度等多个环境参数,为各种应用提供准确可靠的环境数据。该模块采用小巧的封装形式,便于集成到各种设备中,无论是智能家居、可穿戴设备还是工业监测系统,都能轻松适配。例如,在智能家居系统中,BME680 模块可以监测室内环境参数,如温度、湿度、气压和空气质量等。通过与智能家居控制器或智能手机应用程序的连接,用户可以实时了解室内环境状况,并根据需要进行调整。

zheng_ruiguo的专栏 1868
上一篇: 某大型银行深化系统之十四:技术架构
下一篇: 使用Android OpenGL ES 2.0绘图之二:定义形状
innovation
博客等级 码龄14年 251粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值