HarmonyOS(API 12 Beta6版)GPUアクセラレータエンジンサービス【空間領域AIスーパーサンプリング】

XEngine Kitは空間領域AIスーパーサンプリング機能を提供し、単一フレーム画像を用いてAI推論によりフィルターパラメータを生成し、スーパーサンプリングを実現します。GPUとNPUの協調動作により、空間領域GPUスーパーサンプリングよりも高い画質を実現します。スーパーサンプリング倍率が1.5倍以下の場合は推奨されます。

インターフェースの説明

以下のインターフェースはGLES空間領域AIスーパーサンプリング設定インターフェースです。より豊富な設定およびクエリインターフェースをご利用になりたい場合は以下をご参照ください。

インターフェース名 説明
const GLubyte \* HMS\_XEG\_GetString (GLenum name) XEngine GLES拡張機能のクエリインターフェースです。
GL\_APICALL void GL\_APIENTRY HMS\_XEG\_NeuralUpscaleParameter (GLenum pname, GLvoid \* param ) 空間領域AIスーパーサンプリングの入力パラメータを設定します。
GL\_APICALL void GL\_APIENTRY HMS\_XEG\_RenderNeuralUpscale (GLuint inputTexture) 空間領域AIスーパーサンプリングレンダリングコマンドを実行します。

開発手順

本章ではGLES画像API統合を例として、XEngine統合プロセスを説明します。

プロジェクト設定

HAPのコンパイル時、Native層のsoコンパイルにはNDK内のlibxengine.soに依存する必要があります。

  • ヘッダーファイルのインクルード
#include <cstring>
#include <cstdlib>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <xengine/xeg_gles_extension.h>
#include <xengine/xeg_gles_neural_upscale.h>
#include <native_buffer/native_buffer.h>
#include <native_window/external_window.h>

  • CMakeLists.txtの作成

CMakeLists.txtの一部サンプルコードは以下の通りです。

find_library(
    # パス変数の名前を設定
    native-buffer-lib
    # CMakeに探させたいNDKライブラリの名前を指定
    native_buffer
)
find_library(
    # パス変数の名前を設定
    native-window-lib
    # CMakeに探させたいNDKライブラリの名前を指定
    native_window
)
find_library(
    # パス変数の名前を設定
    xengine-lib
    # CMakeに探させたいNDKライブラリの名前を指定
    xengine
)
find_library(
    # パス変数の名前を設定
    EGL-lib
    # CMakeに探させたいNDKライブラリの名前を指定
    EGL
)
find_library(
    # パス変数の名前を設定
    GLES-lib
    # CMakeに探させたいNDKライブラリの名前を指定
    GLESv3
)

target_link_libraries(nativerender PUBLIC
${EGL-lib} ${GLES-lib} ${xengine-lib} ${native-window-lib} ${native-buffer-lib})

XEngine空間領域AIスーパーサンプリング(GLES)の統合

Native層でGLESとXEngineグラフィックAPIを使用して画像レンダリングパイプラインを構築し、空間領域AIスーパーサンプリングを統合します。レンダリング結果は[XComponent]コンポーネントを通じて画面に表示されます。

本節ではGLESグラフィックAPIによる空間領域AIスーパーサンプリングの使用方法について説明します。

  1. [HMS_XEG_GetString]インターフェースを呼び出して、XEngineがサポートする拡張情報を取得し、空間領域AIスーパーサンプリング拡張機能がサポートされているか確認します。XEG_NEURAL_UPSCALE_EXTENSION_NAME拡張がサポートされている場合のみ、空間領域AIスーパーサンプリング関連インターフェースを使用できます。
// XEngineがサポートするGLES拡張情報をクエリ
const char* extensions = (const char*)HMS_XEG_GetString(XEG_EXTENSIONS);
// 空間領域AIスーパーサンプリングのサポートを確認
if (!strstr(extensions, XEG_NEURAL_UPSCALE_EXTENSION_NAME)) {
    exit(1); // エラーを返す
}

  1. 入力テクスチャを作成し、OH_NativeBufferを関連付けます。
// レンダリングサイズと表示サイズはユーザー定義パラメータです。ここでは800*600解像度を1.5倍スーパーサンプリングして1200*900解像度とする例を示します。
uint32_t renderWidth = 800;
uint32_t renderHeight = 600;
uint32_t displayWidth = 1200;
uint32_t displayHeight = 900;
// 関数ポインタを取得
PFNEGLCREATEIMAGEKHRPROC fp_eglCreateImageKHR = reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>(eglGetProcAddress("eglCreateImageKHR"));
PFNEGLDESTROYIMAGEKHRPROC fp_eglDestroyImageKHR = reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>(eglGetProcAddress("eglDestroyImageKHR"));
PFNGLEGLIMAGETARGETTEXTURE2DOESPROC fp_glEGLImageTargetTexture2DOES = reinterpret_cast<PFNGLEGLIMAGETARGETTEXTURE2DOESPROC>(eglGetProcAddress("glEGLImageTargetTexture2DOES"));
// OH_NativeBufferの作成
OH_NativeBuffer_Config config = {};
config.width = renderWidth;
config.height = renderHeight;
config.usage = NATIVEBUFFER_USAGE_CPU_READ | NATIVEBUFFER_USAGE_CPU_READ_OFTEN | NATIVEBUFFER_USAGE_HW_TEXTURE | NATIVEBUFFER_USAGE_HW_RENDER| NATIVEBUFFER_USAGE_ALIGNMENT_512;
config.format = NATIVEBUFFER_PIXEL_FMT_RGBA_8888;
OH_NativeBuffer* bufferHandle = OH_NativeBuffer_Alloc(&config);
if (bufferHandle == nullptr) {
    // 作成失敗時の処理をカスタマイズ可能
}
OHNativeWindowBuffer *nativeWindowBuffer = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(bufferHandle);
EGLImageKHR eglImage = fp_eglCreateImageKHR(eglGetCurrentDisplay(), EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_OHOS, static_cast<EGLClientBuffer>(nativeWindowBuffer), nullptr);
// スーパーサンプリング入力テクスチャの作成
GLuint textureID; 
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
// テクスチャラップおよびフィルターパラメータの設定
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
// スーパーサンプリング入力テクスチャとeglImageの関連付け
fp_glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, eglImage);

  1. スーパーサンプリング入力テクスチャ上でレンダリングを行います。
GLuint fboID = 0;
glGenFramebuffers(1, &fboID);
glBindFramebuffer(GL_FRAMEBUFFER, fboID);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
    // framebuffer作成失敗時の処理をカスタマイズ可能
}
glViewport(0, 0, renderWidth, renderHeight);

  1. [HMS_XEG_NeuralUpscaleParameter]インターフェースを呼び出して、空間領域AIスーパーサンプリングの入力パラメータを設定します。
// sharpnessはユーザー定義のスーパーサンプリングシャープネスパラメータです。ここでは0.3fを例にします。
float sharpness = 0.3f;
HMS_XEG_NeuralUpscaleParameter(XEG_NEURAL_UPSCALE_SHARPNESS, &sharpness);
// inputScissorはスーパーサンプリング入力テクスチャのクリッピングウィンドウパラメータです。
GLuint inputScissor[4] = {0, 0, renderWidth, renderHeight};
HMS_XEG_NeuralUpscaleParameter(XEG_NEURAL_UPSCALE_SCISSOR, inputScissor);
// スーパーサンプリング入力テクスチャに対応するOH_NativeBufferハンドルを設定
HMS_XEG_NeuralUpscaleParameter(XEG_NEURAL_UPSCALE_INPUT_HANDLE, bufferHandle);

  1. [HMS_XEG_RenderNeuralUpscale]インターフェースを呼び出して空間領域AIスーパーサンプリングを実行します。
// スーパーサンプリング結果の描画に使用するフレームバッファをバインドします。ここではデフォルトのフレームバッファを使用し、カスタムフレームバッファも可能です。
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, displayWidth, displayHeight);
// 空間領域AIスーパーサンプリングを実行
HMS_XEG_RenderNeuralUpscale(textureID);

  1. スーパーサンプリングレンダリングが不要になった際には関連リソースを破棄します。
glDeleteFramebuffers(1, &fboID);
glDeleteTextures(1, &textureID);
if (eglImage != nullptr) {
   fp_eglDestroyImageKHR(eglGetCurrentDisplay(), eglImage);
}
if (nativeWindowBuffer != nullptr) {
   OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
}
if (bufferHandle != nullptr) {
   OH_NativeBuffer_Unreference(bufferHandle);
}

最後に

多くの開発者の方が、どのHarmonyOS技術を学ぶべきか分からないという問題があります。HarmonyOS開発職種ではどのような核心技術を習得すべきでしょうか。そのため、HarmonyOS開発の学習は体系的に進める必要があります。

しかし、ネット上のHarmonyOS開発資料は非常に少なく、HarmonyOSアプリ開発やシステム下位開発を習得したい場合は、この資料を参考にすると無駄な道を避け、時間を節約できます。二名の元アリババの上級開発者によって構成された『HarmonyOS NEXT星河版OpenHarmony開発マニュアル』には、(ArkTS、ArkUI開発コンポーネント、Stageモデル、マルチ端末展開、分散型アプリ開発、音声、動画、WebGL、OpenHarmonyマルチメディア技術、Napiコンポーネント、OpenHarmonyカーネル、Harmony南向き開発、Harmonyプロジェクト実践など)HarmonyOS(Harmony NEXT)技術知識が含まれています。

Android、Java、フロントエンドなどの開発者がHarmonyOSに転職したい場合は、この資料を活用して学習を支援できます。下記にHarmonyOS開発の学習パスが示されています。

HarmonyOS成長パスに基づいた学習マニュアルを作成しました。詳細なHarmonyOS(OpenHarmony )マニュアル(合計1236ページ)とHarmonyOS(OpenHarmony )開発入門ビデオを用意しており、技術の道をより前へ進めることを支援します。

  • 『HarmonyOS (OpenHarmony)開発学習動画』
  • 『HarmonyOSエコシステムアプリ開発V2.0ホワイトペーパー』
  • 『HarmonyOS (OpenHarmony)開発基礎から実践マニュアル』
  • OpenHarmony北向き・南向き開発環境構築
  • 『HarmonyOS開発基礎』
  • 『HarmonyOS開発進階』
  • 『HarmonyOS開発実践』

まとめ

HarmonyOS—国家が推進する主要な国産オペレーティングシステムです。一部の大学ではAndroidコースが廃止され、HarmonyOSコースが導入されました。企業もHarmonyOS開発を開始しています。

HarmonyOSには他に類を見ない機会と可能性を持っています。今年末には5,000のアプリがネイティブHarmonyOS開発が完了し、今後50万のアプリがサポートされる予定です。これらのアプリ開発が必要であり、これによりHarmonyOS人材の需要が増加します。HarmonyOS開発者も急増するでしょう。HarmonyOSの学習は不可欠です! 下記から入手してください。

タグ: HarmonyOS OpenHarmony GPU GLES AI

5月30日 05:37 投稿