首頁>技術>

開原始碼:

https://gitee.com/iscas-ohos/OpenGL_ISRC/tree/main

01背景

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 也是使用的這種標準。

02鴻蒙 OpenGL-ISRC 的結構

①Android 的 OpenGL 庫

②Harmony 的 OpenGL-ISRC 庫

由圖 1,OpenGL 庫對比可知,OpenGL-ISRC 整體的結構和 Android OpenGL 類似。

不同之處在於 OpenGL-ISRC 由兩個包組成,分別是 android.opengl 和 ohos.opengl。

android.opengl 裡放置的是目前支援版本的 OpenGLES 標準,ohos.opengl 放置的是常用的影象處理類。且類的數量少於 Android 的 OpenGL。

下面對這幾點給出解釋:

①為什麼其中一個包名是 android.opengl?

採用 C++ 實現介面的方式,透過 so 庫的呼叫實現介面的呼叫。對於目前支援版本的 OpenGLES 標準這部分,Android 已經開源了其生成的 so 庫。

為了避免功能重複開發,此處直接使用 Android 的 so 庫,因此包名必須是 android.opengl。

②OpenGL-ISRC 為什麼由兩個包組成?

對於影象處理類的實現,若繼續採用 Android so 庫呼叫的方式,需要將影象處理類放置於 android.opengl 包下。

此時執行鴻蒙環境,會出現方法宣告重複的錯誤,見圖 2,表明影象處理類中的方法與鴻蒙底層存在的某些方法存在衝突,因此繼續使用 Android so 庫呼叫的方式不再可行。

圖 2:影象處理類放置於 android.opengl 包下的報錯情況

在 OpenGL-ISRC 中,影象處理類這一部分,依舊採用 C++ 實現介面,透過 so 庫呼叫實現介面呼叫的方式。

與 android.opengl 裡的類不同的是,我們對影象處理的類的介面進行了鴻蒙化的移植重構,生成了全新的 so 庫進行呼叫,適配了鴻蒙底層的環境,也避免了此處對安卓的依賴。

鴻蒙 SDK 自帶 OpenGL 庫,見圖1.(3),內部含有 EGL 類。OpenGL-ISRC 是基於鴻蒙平臺,所以直接使用了鴻蒙 SDK 自帶 OpenGL 庫的 EGL 類,避免了功能的重複開發。

④OpenGL-ISRC 中的 GLSuefaceprovider

OpenGL-ISRC 中的 GLSuefaceProvider 在功能上和 Android 的 GLSurfaceView 相同。

因為鴻蒙中的 SurfaceView 命名為 SuefaceProvider,根據命名一致原則,OpenGL-ISRC 中的 GLSurfaceView 命名為 GLSuefaceProvider。

03與鴻蒙 SDK OpenGL 的區別

OpenGL-ISRC 是鴻蒙開源系統的功能相對完整的 OpenGL ES 庫。從使用上來說,OpenGL-ISRC 具有較大的獨立性,與鴻蒙 SDK OpenGL 在實現方式、完善程度、功能提供等方面都存在較大不同。

OpenGL-ISRC 採用 C++ 實現介面,透過 so 庫呼叫實現介面呼叫的方式,而鴻蒙 SDK OpenGL 的介面採用 Java 實現的方式,二者的使用較為獨立,不存在衝突。

圖1,(2)和(3)的對比中可以看出,OpenGL-ISRC 的所提供的功能是相對完善的,鴻蒙 SDK OpenGL 目前還缺少很多標準類,已存在的標準類內部功能也有不完整的現象。

由於鴻蒙 SDK OpenGL 的不完整性,OpenGL-ISRC 支援的 OpenGLES 標準類的實現使用了安卓 so 庫的呼叫,沒有使用鴻蒙 SDK OpenGL 的 OpenGLES 標準。

04OpenGL-ISRC 的使用

①GlSurfaceProvider 的使用示例

此處建立了 GlSurfaceProvider 控制元件,add 到 layout 中進行顯示,如圖 3 所示。

為了增強 GlSurfaceProvider 的視覺化效果,在 GlRenderer 裡面設定了一個紅色的三角圖形。

圖 3 :GlSurfaceProvider 的使用 demo

三角具體屬性見開原始碼:https://gitee.com/iscas-ohos/OpenGL_ISRC/tree/main,顯示效果如圖 4 所示。

圖 4 :GlSurfaceProvider 顯示效果

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

原文連結:https://mp.weixin.qq.com/s/otCLR0n4d23lxDB0L0Il5A

8
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Spring應用搭建之用ThreadLocal儲存登入資訊