目录:

前言

背景

鸿蒙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. Java中Socket的用法

    Socket分为ServerSocket和Socket两大类: 其中ServerSocket用于服务器端,可以通过accept方法监听请求,监听到请求后返回Socket: Socket用户具体完成数据 ...

  2. ipython和jupyter安装

    ipython pip install ipython pip install --upgrade pip jupyter pip install jupyter 查看token: jupyter n ...

  3. ubuntu下scala下载+集成IDEA开发环境

    环境须知: ubuntu 16.04 scala 2.11.0 jdk 1.8.0 Idea 2016.3 JDK环境安装 (1)安装jdk, 注意scala很好的支持jdk 1.8 的jvm 编译环 ...

  4. shell (颜色输出)

    摘自https://www.cnblogs.com/t-road/p/10257296.html #!/bin/bash # #下面是字体输出颜色及终端格式控制 #字体色范围:30-37 echo - ...

  5. Flink-v1.12官方网站翻译-P012-Stateful Stream Processing

    有状态的流处理 什么是状态? 虽然数据流中的许多操作一次只看一个单独的事件(例如事件解析器),但有些操作会记住多个事件的信息(例如窗口操作符).这些操作被称为有状态操作.一些有状态操作的例子. - 当 ...

  6. 十四自定义构建购物计算组件&表单组件

    目录: 1.前言 2.组件介绍 3.js业务逻辑层 4.视图层 5.css属性设置 6.效果呈现 1.前言: 在第九篇文章购物车做好后,还忘记了一个至关重要的计算组件.在鸿蒙的组件中并没有提供这样一个 ...

  7. 年度账单h5 移动端兼容问题以及优化建议(vue)

    定时器 vue实例中定义timer多余,创建的定时器代码和销毁定时器的代码没有放在一起,通常很容易忘记去清理这个定时器,不容易维护:建议使用this.$once('hook:beforeDestory ...

  8. Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round) D. Navigation System(有向图,BFS,最短路)

    题意: n 点 m 边有向图,给出行走路径,求行走途中到路径终点最短路变化次数的最小值和最大值 . 思路 : 逆向广搜,正向模拟. #include <bits/stdc++.h> usi ...

  9. Codeforces Round #608 (Div. 2) E. Common Number (二分,构造)

    题意:对于一个数\(x\),有函数\(f(x)\),如果它是偶数,则\(x/=2\),否则\(x-=1\),不断重复这个过程,直到\(x-1\),我们记\(x\)到\(1\)的这个过程为\(path( ...

  10. hdu2157 How many ways??

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...