Flutter Linux平台如何使用Texture组件展示原生OpenGL渲染内容
Flutter Linux平台OpenGL纹理绑定Texture组件实现步骤
操作流程
你已经完成原生C++ OpenGL三角形绘制逻辑的前提下,按以下步骤完成和Flutter Texture组件的绑定:
- 第一步:获取Flutter桌面纹理注册器
从你初始化的FlutterDesktopEngineRef实例中调用FlutterDesktopEngineGetTextureRegistrar方法,拿到全局纹理注册器实例FlutterDesktopTextureRegistrar*。 - 第二步:注册外部纹理
构造FlutterDesktopTextureInfo结构体,按以下参数配置:- 把
type字段设置为kFlutterDesktopOpenGLTexture,指定是OpenGL纹理类型 - 实现
gl_texture.callback回调函数,函数返回值为你当前已完成绘制的OpenGL纹理ID,同时将纹理的宽、高赋值给回调的出参
调用FlutterDesktopRegisterExternalTexture方法完成纹理注册,该方法返回的64位无符号整数就是你需要传给Flutter Texture组件的texture ID。
- 把
- 第三步:配置OpenGL上下文共享
Flutter桌面端默认会创建一个GLFW上下文用于自身渲染,你需要在引擎初始化主线程中调用glfwGetCurrentContext()拿到Flutter的GL上下文,创建你自己的绘制线程的GL上下文时,将该上下文设置为共享上下文,保证你在绘制线程生成的OpenGL纹理资源可以被Flutter渲染线程访问。 - 第四步:离屏渲染到纹理并通知更新
你自己的C++绘制逻辑中,创建对应尺寸的2D纹理,绑定FBO将三角形绘制到该纹理上,每完成一帧绘制后,调用FlutterDesktopMarkTextureFrameAvailable方法,传入第二步注册得到的texture ID,通知Flutter拉取最新的纹理帧。 - 第五步:Dart侧渲染
直接在Dart代码中使用Texture组件,将第二步拿到的texture ID赋值给组件的textureId参数即可,用法和移动端完全一致。
注意事项
- 所有OpenGL相关操作必须在对应的上下文所属线程执行,禁止跨线程调用GL接口,否则会出现资源访问异常
- 纹理格式推荐使用RGBA8,无需额外配置即可被Flutter正常识别
- 页面销毁或者不再使用该纹理时,记得调用
FlutterDesktopUnregisterTexture方法注销纹理,避免内存泄漏
内容的提问来源于stack exchange,提问作者Josh Chiu
相关产品推荐
相关产品推荐

