HarmonyOS 鸿蒙Next 只能拿到NativeImage的SurfaceID场景下,如何将openGL的内容绘制到这个surface中?
HarmonyOS 鸿蒙Next 只能拿到NativeImage的SurfaceID场景下,如何将openGL的内容绘制到这个surface中?
有一个 NativeImage
的 SurfaceID
,如何将 OpenGL 的纹理渲染到这个 SurfaceID
上?
在使用 Flutter 的 textureRegistry
注册一个 surface
后,需要将 OpenGL 的纹理渲染到这个 surface
上。但是,Flutter 提供的是一个 NativeImage
的 SurfaceId
,无法通过这个 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>.
因此,想问一下在这种只能拿到 NativeImage
的 SurfaceID
场景下,如何将 OpenGL 的内容绘制到这个 surface
上?
更多关于HarmonyOS 鸿蒙Next 只能拿到NativeImage的SurfaceID场景下,如何将openGL的内容绘制到这个surface中?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
提供下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时,可以通过以下步骤实现:
-
获取SurfaceID:首先,确保你已经成功从NativeImage对象中获取了SurfaceID。这是进行后续绘制操作的前提。
-
创建EGLSurface:利用获取到的SurfaceID,通过EGL接口创建一个与之关联的EGLSurface。这一步是建立OpenGL与Surface之间联系的关键。
-
绑定EGLSurface:在OpenGL渲染之前,需要将当前渲染上下文绑定到刚才创建的EGLSurface上。这通常涉及调用EGL的绑定函数。
-
进行OpenGL绘制:在绑定成功后,就可以像平常一样使用OpenGL的绘制命令进行内容渲染了。所有绘制的内容都会直接输出到指定的Surface上。
-
释放资源:绘制完成后,记得释放EGLSurface和其他相关资源,以避免资源泄漏。
请注意,上述步骤涉及具体的EGL和OpenGL API调用,需要根据HarmonyOS的SDK文档和API规范进行具体实现。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html