鸿蒙(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(
    # Sets the name of the path variable.
    native-buffer-lib
    # Specifies the name of the NDK library that you want CMake to locate.
    native_buffer
)
find_library(
    # Sets the name of the path variable.
    native-window-lib
    # Specifies the name of the NDK library that you want CMake to locate.
    native_window
)
find_library(
    # Sets the name of the path variable.
    xengine-lib
    # Specifies the name of the NDK library that you want CMake to locate.
    xengine
)
find_library(
    # Sets the name of the path variable.
    EGL-lib
    # Specifies the name of the NDK library that you want CMake to locate.
    EGL
)
find_library(
    # Sets the name of the path variable.
    GLES-lib
    # Specifies the name of the NDK library that you want CMake to locate.
    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); // return error
    }

  2. 创建输入纹理,并关联一个OH_NativeBuffer。

    // 渲染宽高和送显宽高均为用户自定义参数,这里以将800600的分辨率进行1.5倍超分到1200900的分辨率为例
    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);

  3. 在超分输入纹理上进行渲染。

    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);

  4. 调用[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);

  5. 调用[HMS_XEG_RenderNeuralUpscale]接口执行空域AI超分。

    // 绑定绘制超分结果的帧缓冲,此处使用默认帧缓冲,也可使用用户自定义帧缓冲
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glViewport(0, 0, displayWidth, displayHeight);
    // 执行空域AI超分
    HMS_XEG_RenderNeuralUpscale(textureID);

  6. 不需要进行超分渲染时,销毁相关资源。

    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);
    }

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档 》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 《鸿蒙 (OpenHarmony)开发学习视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙开发实战》

总结

鸿蒙---作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿

相关推荐
物联网软硬件开发-轨物科技43 分钟前
【轨物方案】新能源的下半场:构筑光伏场站全生命周期智慧运维新范式
大数据·人工智能·物联网
2501_936146041 小时前
【目标检测】钙钛矿晶体YOLO11-GhostDynamicConv模型改进与实现_1
人工智能·目标检测·计算机视觉
Deepoch1 小时前
Deepoc具身模型:电厂巡检机械狗的智能核心
人工智能·科技·机器狗·具身模型·deepoc·机械狗·巡检机械狗
好奇龙猫5 小时前
【人工智能学习-AI入试相关题目练习-第七次】
人工智能·学习
Mao.O8 小时前
开源项目“AI思维圆桌”的介绍和对于当前AI编程的思考
人工智能
jake don8 小时前
AI 深度学习路线
人工智能·深度学习
寒季6668 小时前
Electron 实战:构建跨平台桌面端 Markdown 编辑器(含实时预览、文件操作、快捷键)
华为·electron·harmonyos
信创天地8 小时前
信创场景软件兼容性测试实战:适配国产软硬件生态,破解运行故障难题
人工智能·开源·dubbo·运维开发·risc-v
幻云20108 小时前
Python深度学习:从筑基到登仙
前端·javascript·vue.js·人工智能·python
无风听海9 小时前
CBOW 模型中的输出层
人工智能·机器学习