目录:

前言

背景

鸿蒙OpenGL-ISRC的结构

OpenGL-ISRC和鸿蒙SDK OpenGL的区别

OpenGL-ISRC的使用

前言

基于安卓平台的OpenGL(androidxref.com/9.0.0\_r3/)

实现功能的鸿蒙化迁移和重构,全球首发鸿蒙平台的OpenGL-ISRC,代码已经开源到(https://gitee.com/iscas-ohos/OpenGL_ISRC/tree/main)

欢迎各位下载使用并提出宝贵意见!

背景

OpenGL(Open Graphics Library)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API),可绘制从简单的图形到复杂的三维景象,操作在GPU之上,实现硬件加速渲染 。目前,Microsoft、SGI、IBM、DEC、SUN、HP等大公司都采用了OpenGL做为三维图形标准,著名的动画制作软件Soft Image和3D Studio MAX、仿真软件Open Inventor、VR软件World Tool Kit、CAM软件ProEngineer、GIS软ARC/INFO等等都是以OpenGL为基础制作完成的。OpenGL是个与硬件无关的软件接口,可以在不同的平台之间移植。

OpenGLES是OpenGL的高性能版本,删减了其中的低效能的操作方式,Android就是使用的这种标准,因此鸿蒙平台的OpenGL-ISRC也是使用的这种标准。

鸿蒙OpenGL-ISRC的结构

(1) Android的OpenGL库

(2) Harmony的OpenGL-ISRC库

(3)Harmony的OpenGL库

图1 :OpenGL库对比

由图1可知,OpenGL-ISRC整体的结构和Android OpenGL类似,不同之处在于OpenGL-ISRC由两个包组成,分别是android.opengl和ohos.opengl。android.opengl里放置的是目前支持版本的OpenGLES标准,ohos.opengl放置的是常用的图像处理类。且类的数量少于Android的OpenGL。下面对这几点给出解释。

(1)为什么其中一个包名是android.opengl?

采用C++实现接口的方式,通过so库的调用实现接口的调用。对于目前支持版本的OpenGLES标准这部分,Android已经开源了其生成的so库,为了避免功能重复开发,此处直接使用Android的so库,因此包名必须是android.opengl。

(2)OpenGL-ISRC为什么由两个包组成?

对于图像处理类的实现,若继续采用Android so库调用的方式,需要将图像处理类放置于android.opengl包下,此时运行鸿蒙环境,会出现方法声明重复的错误,见图2,表明图像处理类中的方法与鸿蒙底层存在的某些方法存在冲突,因此继续使用Android so库调用的方式不再可行。

图2:图像处理类放置于android.opengl包下的报错情况

在OpenGL-ISRC中,图像处理类这一部分,依旧采用C++实现接口,通过so库调用实现接口调用的方式。与android.opengl里的类不同的是,我们对图像处理的类的接口进行了鸿蒙化的移植重构,生成了全新的so库进行调用,适配了鸿蒙底层的环境,也避免了此处对安卓的依赖。

(3)OpenGL-ISRC为什么缺少EGL类?

鸿蒙SDK自带OpenGL库,见图1.(3),内部含有EGL类。OpenGL-ISRC是基于鸿蒙平台,所以直接使用了鸿蒙SDK自带OpenGL库的EGL类,避免了功能的重复开发。

(4)OpenGL-ISRC中的GLSuefaceprovider

OpenGL-ISRC中的GLSuefaceProvider在功能上和Android的GLSurfaceView相同。因为鸿蒙中的SurfaceView命名为SuefaceProvider,根据命名一致原则,OpenGL-ISRC中的GLSurfaceView命名为GLSuefaceProvider。

OpenGL-ISRC和鸿蒙SDK OpenGL的区别

OpenGL-ISRC是鸿蒙开源系统的功能相对完整的OpenGL ES库。从使用上来说,OpenGL-ISRC具有较大的独立性,与鸿蒙SDK OpenGL在实现方式、完善程度、功能提供等方面都存在较大不同。

(1) OpenGL-ISRC采用C++实现接口,通过so库调用实现接口调用的方式,而鸿蒙SDK OpenGL 的接口采用java实现的方式,二者的使用较为独立,不存在冲突; (2)图1.(2)和(3)的对比中可以看出,OpenGL-ISRC的所提供的功能是相对完善的,鸿蒙SDK OpenGL目前还缺少很多标准类,已存在的标准类内部功能也有不完整的现象。

(3)OpenGL-ISRC封装使用了鸿蒙SDK OpenGL的EGL类,避免功能重复开发,因此二者是互相完善的关系;

(4)由于鸿蒙SDK OpenGL的不完整性,OpenGL-ISRC支持的OpenGLES标准类的实现使用了安卓so库的调用,没有使用鸿蒙SDK OpenGL的OpenGLES标准。

OpenGL-ISRC的使用

(1)GlSurfaceProvider的使用示例

此处创建了GlSurfaceProvider控件,add到layout中进行显示,如图3所示。为了增强GlSurfaceProvider的可视化效果,在GlRenderer里面设置了一个红色的三角图形(三角具体属性见开源代码:https://gitee.com/iscas-ohos/OpenGL_ISRC/tree/main),显示效果如图4所示。

图3 GlSurfaceProvider的使用demo

图4 GlSurfaceProvider显示效果

(2)EGL和ETC1的使用示例

为了验证了EGL的显示效果,在initView()方法中给Viewport设置了紫色方块视图属性(见开源代码:https://gitee.com/iscas-ohos/OpenGL_ISRC/tree/main)。 为了验证ETC1的有效性,将ETC1.getEncodedDataSize()的结果输出到一个Text中进行显示。 当EGL显示紫色方块,Text上显示ETC1.getEncodedDataSize()的结果时,证明EGL和ETC1类可成功使用,二者的显示效果如图6所示。

图5 EGL和ETC1的使用demo

图6:EGL的显示效果、ETC1的输出效果

项目贡献人:戴研 郑森文 朱伟 陈美汝

作者:小雪糕123

想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

全球首发—鸿蒙开源平台OpenGL的更多相关文章

  1. 【全网首发】鸿蒙开源三方组件--强大的弹窗库XPopup组件

    目录: 1.介绍 2.效果一览 3.依赖 4.如何使用 5.下载链接 6.<鸿蒙开源三方组件>文章合集 1. 介绍 ​ XPopup是一个弹窗库,可能是Harmony平台最好的弹窗库.它从 ...

  2. 全球第一免费开源ERP Odoo Ubuntu最佳开发环境独家首发分享

    起源 近年来随着国内的互联网经济的快速腾飞,诞生了很多开源软件创造的市场价值以及企业价值神话,特别是对于企业ERP领域,一直以来都是高昂的国内外产品充实,国内的中小成长型企业越来越需要一套好看又能打, ...

  3. !!!全球最流行开源硬件平台!不知道就OUT了!

    全球最流行的几个开源硬件平台!不知道就OUT了! 随着物联网的推广和普及,五年内全球会有200亿台智能设备的需求,而如今随着创客概念的兴起,开源硬件也越加的火热,让我们来看看现在都有哪些主流的开源硬件 ...

  4. 阿里巴巴Java开发规约插件全球首发!(转)

    https://mp.weixin.qq.com/s?__biz=MzI0NTE4NjA0OQ==&mid=2658355901&idx=1&sn=3169172bfc6819 ...

  5. 免费试用 | 多模 NoSQL 服务GeminiDB for Cassandra 全球首发

    PS:多模NoSQL服务GeminiDB重磅公测,免费体验,参与公测还有华为AI音响好礼相送~ 7月5日,华为云多模 NoSQL 服务GeminiDB for Cassandra正式对外定向邀测.华为 ...

  6. 为互联网业务而生:阿里云全球首发云Cassandra服务!

    引言:十年沉淀.全球宽表排名第一.阿里云首发云Cassandra服务 ApsaraDB for Cassandra是基于开源Apache Cassandra,融合阿里云数据库DBaaS能力的分布式No ...

  7. 鸿蒙开源第三方件组件——轮播组件Banner

    目录: 1.功能展示 2.Sample解析 3.Library解析 4.<鸿蒙开源第三方组件>系列文章合集 前言 基于安卓平台的轮播组件Banner(https://github.com/ ...

  8. 鸿蒙开源第三方组件——SlidingMenu_ohos侧滑菜单组件

    目录: 1.前言 2.背景 3.效果展示 4.Sample解析 5.Library解析 6.<鸿蒙开源第三方组件>文章合集 前言 基于安卓平台的SlidingMenu侧滑菜单组件(http ...

  9. R可视化lend_club 全球最大的P2P平台数据75W条

    lend_club 全球最大的P2P平台2007~2012年贷款数据百度云下载. 此文章基于R语言做简单分析. rm(list=ls()) #清除变量 gc() #释放内存 step1 考虑到后续分析 ...

随机推荐

  1. Language Guide (proto3) | proto3 语言指南(七)更新消息类型

    Updating A Message Type - 更新消息类型 如果现有的消息类型不再满足您的所有需要(例如,您希望消息格式有一个额外的字段),但是您仍然希望使用用旧格式创建的代码,不要担心!在不破 ...

  2. VIT Vision Transformer | 先从PyTorch代码了解

    文章原创自:微信公众号「机器学习炼丹术」 作者:炼丹兄 联系方式:微信cyx645016617 代码来自github [前言]:看代码的时候,也许会不理解VIT中各种组件的含义,但是这个文章的目的是了 ...

  3. cassandra权威指南读书笔记--Cassandra架构(3)

    分阶段事件驱动架构 SEDASEDA(Staged Event-Driven Architecture)的核心思想是把一个请求处理过程分成几个Stage,不同资源消耗的Stage使用不同数量的线程来处 ...

  4. k8s~kubectl常用命令

    查看所有 pod 列表, -n 后跟 namespace, 查看指定的命名空间 kubectl get pod kubectl get pod -n kube kubectl get pod -o w ...

  5. Codeforces Global Round 8 A. C+=(贪心)

    题目链接:https://codeforces.com/contest/1368/problem/A 题意 给出 $a,b$,只可以使用 '+=' 运算符,问至少要使用多少次使得 $a$ 或 $b$ ...

  6. HttpServletResponse的学习

    关于Response对象的一些方法和属性可以查看官方文档:https://javaee.github.io/javaee-spec/javadocs/ 比如里面定义了许多常量: 这些都是服务器向浏览器 ...

  7. 【uva 11491】Erasing and Winning(算法效率--贪心+单调队列)

    题意:有一个N位整数,要求输出删除其中D个数字之后的最大整数. 解法:贪心.(P.S.要小心,我WA了2次...)由于规定了整数的位数,那么我们要尽量让高位的数字大一些,也就是要尽量删去前面小的数字. ...

  8. A. Little Elephant and Interval

    The Little Elephant very much loves sums on intervals. This time he has a pair of integers l and r ( ...

  9. C++实现邻接表

    对于无向图(V0,V1),(V1,V2),(V2,V3),(V0,V2)对应的邻接表表示就是 在代码中,你要单独对V1.V2.V3创建一种结构体类型.在对后面的节点0,1,2,3创建一种结构体类型 代 ...

  10. .NET并发编程-函数闭包

    本系列学习在.NET中的并发并行编程模式,实战技巧 内容目录 函数式编程闭包的应用记忆化函数缓存 函数式编程 一个函数输出当做另一个函数输入.有时候一个复杂问题,我们拆分成很多个步骤函数,这些函数组合 ...