全球首发—鸿蒙开源平台OpenGL 原创 精华

朱伟ISRC
发布于 2021-2-8 14:39
浏览
15收藏

前言    

基于安卓平台的OpenGL(http://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的结构

  全球首发—鸿蒙开源平台OpenGL-鸿蒙开发者社区

(1)  Android的OpenGL库

全球首发—鸿蒙开源平台OpenGL-鸿蒙开发者社区

 (2)  Harmony的OpenGL-ISRC库

全球首发—鸿蒙开源平台OpenGL-鸿蒙开发者社区 (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库调用的方式不再可行。

全球首发—鸿蒙开源平台OpenGL-鸿蒙开发者社区

图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所示。

全球首发—鸿蒙开源平台OpenGL-鸿蒙开发者社区图3  GlSurfaceProvider的使用demo

全球首发—鸿蒙开源平台OpenGL-鸿蒙开发者社区 图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所示。

全球首发—鸿蒙开源平台OpenGL-鸿蒙开发者社区图5 EGL和ETC1的使用demo

全球首发—鸿蒙开源平台OpenGL-鸿蒙开发者社区

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

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

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2021-2-9 18:00:30修改
23
收藏 15
回复
举报
23条回复
按时间正序
/
按时间倒序
Aceryt
Aceryt

可以拿来学习波

回复
2021-2-8 22:20:16
鸿蒙张荣超
鸿蒙张荣超

好文!一大波鸿蒙小游戏在路上了^_^

回复
2021-2-8 23:35:08
鸿蒙时代
鸿蒙时代

学习啦

回复
2021-2-9 11:42:21
Whyalone
Whyalone

OpenGL都搞出来了!!

回复
2021-2-9 17:53:56
软通田可辉
软通田可辉

好文,学习了

回复
2021-2-10 09:27:40
朱伟ISRC
朱伟ISRC 回复了 鸿蒙张荣超
好文!一大波鸿蒙小游戏在路上了^_^

谢谢!

回复
2021-2-22 12:44:15
朱伟ISRC
朱伟ISRC 回复了 软通田可辉
好文,学习了

感谢认可!

回复
2021-2-22 12:44:40
软通田可辉
软通田可辉 回复了 朱伟ISRC
感谢认可!

一起加油

回复
2021-2-22 14:13:35
蒙娜丽宁
蒙娜丽宁

有人移植游戏引擎吗?只使用OpenGL ES,开发还是太累,很多都需要自己做。

回复
2021-2-28 12:06:17
白马歌歌
白马歌歌

这是高手

回复
2021-3-2 17:53:54
Whyalone
Whyalone 回复了 蒙娜丽宁
有人移植游戏引擎吗?只使用OpenGL ES,开发还是太累,很多都需要自己做。

这个工作量会不会太庞大了?

回复
2021-3-3 13:53:16
蒙娜丽宁
蒙娜丽宁 回复了 Whyalone
这个工作量会不会太庞大了?

直接用OpenGL开发游戏的工作量更庞大。移植游戏引擎是牺牲我一个,幸福千万人。利在当代,功在千秋的好事。_^_

回复
2021-3-4 08:16:36
朱伟ISRC
朱伟ISRC 回复了 白马歌歌
这是高手

谢谢!

回复
2021-5-12 17:04:25
朱伟ISRC
朱伟ISRC 回复了 Aceryt
可以拿来学习波

谢谢支持!

回复
2021-5-12 17:04:52
朱伟ISRC
朱伟ISRC 回复了 鸿蒙时代
学习啦

谢谢支持!

回复
2021-5-12 17:05:14
千云山庄
千云山庄

张老师.李老师都来了 请问这个库怎么用 

1
回复
2021-6-13 22:24:38
wx60e6e94528575
wx60e6e94528575

在老师提供的源码基础上,添加着色器的初始化,调用GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);程序会崩溃?一直找不到原因?请老师指导一下。

已于2021-8-6 17:52:49修改
回复
2021-8-6 17:48:13
Der_带鱼
Der_带鱼

好文!!!感谢老师

回复
2021-8-6 18:32:31
Anzia
Anzia

百度了一波OpenGL,谢谢前辈们移植过来!

1
回复
2021-8-6 21:06:52
朱伟ISRC
朱伟ISRC 回复了 Anzia
百度了一波OpenGL,谢谢前辈们移植过来!

哈哈哈 ,能帮助到你们狠开心!

回复
2021-8-9 09:22:03
回复
    相关推荐