HarmonyOS 鸿蒙Next 只能拿到NativeImage的SurfaceID场景下,如何将openGL的内容绘制到这个surface中?

发布于 1周前 作者 h691938207 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 只能拿到NativeImage的SurfaceID场景下,如何将openGL的内容绘制到这个surface中? 有一个 NativeImageSurfaceID,如何将 OpenGL 的纹理渲染到这个 SurfaceID 上?

在使用 Flutter 的 textureRegistry 注册一个 surface 后,需要将 OpenGL 的纹理渲染到这个 surface 上。但是,Flutter 提供的是一个 NativeImageSurfaceId,无法通过这个 SurfaceId 创建 SurfaceWindow

注册 Surface

let texture = this.textureRegistry?.getTextureId();

let surface = this.textureRegistry?.registerTexture(texture);

if (surface?.getSurfaceId() === undefined) {
  result.error("-1", "initMagnifier", "SurfaceId is undefined");
  return;
}

glNapi.initSurface(surface?.getSurfaceId(), vWidth, vHeight, true);

glNapi.initSurface 中部分代码

NativeWindow *window;

OH_NativeWindow_CreateNativeWindowFromSurfaceId(surfaceId, &window);

这个 surfaceId 就是上面代码中拿到的

OH_NativeWindow_NativeWindowHandleOpt(window, SET_BUFFER_GEOMETRY, width, height);

EGLNativeWindowType nativeWindow = reinterpret_cast<EGLNativeWindowType>(window);

EGLDisplay eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);

EGLint numConfigs;

EGLConfig config;

EGLint configAttribs[] = {EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT, EGL_NONE};

EGLint surfaceAttribs[] = {EGL_NONE};

eglChooseConfig(eglDisplay, configAttribs, &config, 1, &numConfigs);

windowSurface = eglCreateWindowSurface(eglDisplay, config, nativeWindow, surfaceAttribs);

if (windowSurface == EGL_NO_SURFACE) {
  napi_throw_error(env, "gl_helper_library", "Failed to create window surface");
}

eglMakeCurrent(eglDisplay, windowSurface, windowSurface, eGLContext);

glRender = new GLRender(mirror);

在代码 OH_NativeWindow_CreateNativeWindowFromSurfaceId(surfaceId, &window); 执行后,出现以下报错日志:

<317>GetNativeWindow: Cannot find nativeWindow by uniqueId <private>.

因此,想问一下在这种只能拿到 NativeImageSurfaceID 场景下,如何将 OpenGL 的内容绘制到这个 surface 上?


更多关于HarmonyOS 鸿蒙Next 只能拿到NativeImage的SurfaceID场景下,如何将openGL的内容绘制到这个surface中?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

提供下OH_NativeWindow_CreateNativeWindowFromSurfaceId错误码和hilog错误日志。

更多关于HarmonyOS 鸿蒙Next 只能拿到NativeImage的SurfaceID场景下,如何将openGL的内容绘制到这个surface中?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


已经解决了,上面提供的代码是正确的,是我的EGL参数有误导致的无法创建windowSurface

出现的错误只有这一条:
`GetNativeWindow: Cannot find nativeWindow by uniqueId <private>.`

实际上没有造成影响,被报错误导了,

在HarmonyOS鸿蒙Next环境中,当只能获取到NativeImage的SurfaceID,并需要将OpenGL的内容绘制到这个Surface时,可以通过以下步骤实现:

  1. 获取SurfaceID:首先,确保你已经成功从NativeImage对象中获取了SurfaceID。这是进行后续绘制操作的前提。

  2. 创建EGLSurface:利用获取到的SurfaceID,通过EGL接口创建一个与之关联的EGLSurface。这一步是建立OpenGL与Surface之间联系的关键。

  3. 绑定EGLSurface:在OpenGL渲染之前,需要将当前渲染上下文绑定到刚才创建的EGLSurface上。这通常涉及调用EGL的绑定函数。

  4. 进行OpenGL绘制:在绑定成功后,就可以像平常一样使用OpenGL的绘制命令进行内容渲染了。所有绘制的内容都会直接输出到指定的Surface上。

  5. 释放资源:绘制完成后,记得释放EGLSurface和其他相关资源,以避免资源泄漏。

请注意,上述步骤涉及具体的EGL和OpenGL API调用,需要根据HarmonyOS的SDK文档和API规范进行具体实现。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部