全球首發—鴻蒙開源平臺OpenGL

目錄:java

前言android

背景git

鴻蒙OpenGL-ISRC的結構編程

OpenGL-ISRC和鴻蒙SDK OpenGL的區別ide

OpenGL-ISRC的使用post

 

前言性能

基於安卓平臺的OpenGL(androidxref.com/9.0.0\_r3/)動畫

實現功能的鴻蒙化遷移和重構,全球首發鴻蒙平臺的OpenGL-ISRC,代碼已經開源到(https://gitee.com/iscas-ohos/OpenGL_ISRC/tree/main)url

歡迎各位下載使用並提出寶貴意見!.net

背景

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的輸出效果

項目貢獻人:戴研 鄭森文 朱偉 陳美汝

做者:小雪糕123

想了解更多內容,請訪問: 51CTO和華爲官方戰略合做共建的鴻蒙技術社區https://harmonyos.51cto.com

相關文章
相關標籤/搜索