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超分的使用。
-
调用[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
} -
创建输入纹理,并关联一个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); -
在超分输入纹理上进行渲染。
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); -
调用[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); -
调用[HMS_XEG_RenderNeuralUpscale]接口执行空域AI超分。
// 绑定绘制超分结果的帧缓冲,此处使用默认帧缓冲,也可使用用户自定义帧缓冲
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, displayWidth, displayHeight);
// 执行空域AI超分
HMS_XEG_RenderNeuralUpscale(textureID); -
不需要进行超分渲染时,销毁相关资源。
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 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿