全球首發(fā)—鴻蒙開源平臺(tái)OpenGL
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz
前言
基于安卓平臺(tái)的OpenGL(http://androidxref.com/9.0.0_r3/),實(shí)現(xiàn)功能的鴻蒙化遷移和重構(gòu),全球首發(fā)鴻蒙平臺(tái)的OpenGL-ISRC,代碼已經(jīng)開源到(https://gitee.com/iscas-ohos/OpenGL_ISRC/tree/main),歡迎各位下載使用并提出寶貴意見!
背景
OpenGL(Open Graphics Library)是用于渲染2D、3D矢量圖形的跨語言、跨平臺(tái)的應(yīng)用程序編程接口(API),可繪制從簡(jiǎn)單的圖形到復(fù)雜的三維景象,操作在GPU之上,實(shí)現(xiàn)硬件加速渲染 。目前,Microsoft、SGI、IBM、DEC、SUN、HP等大公司都采用了OpenGL做為三維圖形標(biāo)準(zhǔn),著名的動(dòng)畫制作軟件Soft Image和3D Studio MAX、仿真軟件Open Inventor、VR軟件World Tool Kit、CAM軟件ProEngineer、GIS軟ARC/INFO等等都是以O(shè)penGL為基礎(chǔ)制作完成的。OpenGL是個(gè)與硬件無關(guān)的軟件接口,可以在不同的平臺(tái)之間移植。
OpenGLES是OpenGL的高性能版本,刪減了其中的低效能的操作方式,Android就是使用的這種標(biāo)準(zhǔn),因此鴻蒙平臺(tái)的OpenGL-ISRC也是使用的這種標(biāo)準(zhǔn)。
鴻蒙OpenGL-ISRC的結(jié)構(gòu)

(1) Android的OpenGL庫(kù)

(2) Harmony的OpenGL-ISRC庫(kù)

(3)Harmony的OpenGL庫(kù)
圖1 :OpenGL庫(kù)對(duì)比
由圖1可知,OpenGL-ISRC整體的結(jié)構(gòu)和Android OpenGL類似,不同之處在于OpenGL-ISRC由兩個(gè)包組成,分別是android.opengl和ohos.opengl。android.opengl里放置的是目前支持版本的OpenGLES標(biāo)準(zhǔn),ohos.opengl放置的是常用的圖像處理類。且類的數(shù)量少于Android的OpenGL。下面對(duì)這幾點(diǎn)給出解釋。
(1)為什么其中一個(gè)包名是android.opengl?
采用C++實(shí)現(xiàn)接口的方式,通過so庫(kù)的調(diào)用實(shí)現(xiàn)接口的調(diào)用。對(duì)于目前支持版本的OpenGLES標(biāo)準(zhǔn)這部分,Android已經(jīng)開源了其生成的so庫(kù),為了避免功能重復(fù)開發(fā),此處直接使用Android的so庫(kù),因此包名必須是android.opengl。
(2)OpenGL-ISRC為什么由兩個(gè)包組成?
對(duì)于圖像處理類的實(shí)現(xiàn),若繼續(xù)采用Android so庫(kù)調(diào)用的方式,需要將圖像處理類放置于android.opengl包下,此時(shí)運(yùn)行鴻蒙環(huán)境,會(huì)出現(xiàn)方法聲明重復(fù)的錯(cuò)誤,見圖2,表明圖像處理類中的方法與鴻蒙底層存在的某些方法存在沖突,因此繼續(xù)使用Android so庫(kù)調(diào)用的方式不再可行。

圖2:圖像處理類放置于android.opengl包下的報(bào)錯(cuò)情況
在OpenGL-ISRC中,圖像處理類這一部分,依舊采用C++實(shí)現(xiàn)接口,通過so庫(kù)調(diào)用實(shí)現(xiàn)接口調(diào)用的方式。與android.opengl里的類不同的是,我們對(duì)圖像處理的類的接口進(jìn)行了鴻蒙化的移植重構(gòu),生成了全新的so庫(kù)進(jìn)行調(diào)用,適配了鴻蒙底層的環(huán)境,也避免了此處對(duì)安卓的依賴。
(3)OpenGL-ISRC為什么缺少EGL類?
鴻蒙SDK自帶OpenGL庫(kù),見圖1.(3),內(nèi)部含有EGL類。OpenGL-ISRC是基于鴻蒙平臺(tái),所以直接使用了鴻蒙SDK自帶OpenGL庫(kù)的EGL類,避免了功能的重復(fù)開發(fā)。
(4)OpenGL-ISRC中的GLSuefaceprovider
OpenGL-ISRC中的GLSuefaceProvider在功能上和Android的GLSurfaceView相同。因?yàn)轼櫭芍械腟urfaceView命名為SuefaceProvider,根據(jù)命名一致原則,OpenGL-ISRC中的GLSurfaceView命名為GLSuefaceProvider。
OpenGL-ISRC和鴻蒙SDK OpenGL的區(qū)別
OpenGL-ISRC是鴻蒙開源系統(tǒng)的功能相對(duì)完整的OpenGL ES庫(kù)。從使用上來說,OpenGL-ISRC具有較大的獨(dú)立性,與鴻蒙SDK OpenGL在實(shí)現(xiàn)方式、完善程度、功能提供等方面都存在較大不同。
(1) OpenGL-ISRC采用C++實(shí)現(xiàn)接口,通過so庫(kù)調(diào)用實(shí)現(xiàn)接口調(diào)用的方式,而鴻蒙SDK OpenGL 的接口采用java實(shí)現(xiàn)的方式,二者的使用較為獨(dú)立,不存在沖突; (2)圖1.(2)和(3)的對(duì)比中可以看出,OpenGL-ISRC的所提供的功能是相對(duì)完善的,鴻蒙SDK OpenGL目前還缺少很多標(biāo)準(zhǔn)類,已存在的標(biāo)準(zhǔn)類內(nèi)部功能也有不完整的現(xiàn)象。
(3)OpenGL-ISRC封裝使用了鴻蒙SDK OpenGL的EGL類,避免功能重復(fù)開發(fā),因此二者是互相完善的關(guān)系;
(4)由于鴻蒙SDK OpenGL的不完整性,OpenGL-ISRC支持的OpenGLES標(biāo)準(zhǔn)類的實(shí)現(xiàn)使用了安卓so庫(kù)的調(diào)用,沒有使用鴻蒙SDK OpenGL的OpenGLES標(biāo)準(zhǔn)。
OpenGL-ISRC的使用
(1)GlSurfaceProvider的使用示例
此處創(chuàng)建了GlSurfaceProvider控件,add到layout中進(jìn)行顯示,如圖3所示。為了增強(qiáng)GlSurfaceProvider的可視化效果,在GlRenderer里面設(shè)置了一個(gè)紅色的三角圖形(三角具體屬性見開源代碼:https://gitee.com/iscas-ohos/OpenGL_ISRC/tree/main),顯示效果如圖4所示。

圖3 GlSurfaceProvider的使用demo

圖4 GlSurfaceProvider顯示效果
(2)EGL和ETC1的使用示例
為了驗(yàn)證了EGL的顯示效果,在initView()方法中給Viewport設(shè)置了紫色方塊視圖屬性(見開源代碼:https://gitee.com/iscas-ohos/OpenGL_ISRC/tree/main)。 為了驗(yàn)證ETC1的有效性,將ETC1.getEncodedDataSize()的結(jié)果輸出到一個(gè)Text中進(jìn)行顯示。 當(dāng)EGL顯示紫色方塊,Text上顯示ETC1.getEncodedDataSize()的結(jié)果時(shí),證明EGL和ETC1類可成功使用,二者的顯示效果如圖6所示。

圖5 EGL和ETC1的使用demo

圖6:EGL的顯示效果、ETC1的輸出效果
項(xiàng)目貢獻(xiàn)人:戴研 鄭森文 朱偉 陳美汝
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz