OpenGL/Skia渲染GL_TEXTURE_EXTERNAL_OES到GL_TEXTURE_2D时帧冻结故障排查
Android Camera2+OpenGL/Skia 帧渲染异常问题排查
问题背景
原本基于OpenGL的Android Camera2应用运行正常:相机帧输出到SurfaceTexture(对应OpenGL的GL_TEXTURE_EXTERNAL_OES纹理),通过直通着色器可直接渲染到1920x1080预览EGLSurface与4000x2000录像EGLSurface。
改造后异常表现
为实现在相机帧上绘制图形(如红框),引入Skia并设计新渲染流程:
Camera → GL_TEXTURE_EXTERNAL_OES → Skia渲染至绑定FBO1的GL_TEXTURE_2D离屏纹理(绘制图形) → GL_TEXTURE_2D → 直通着色器 → 预览/录像EGLSurface
实际运行时仅显示首帧,后续画面冻结并出现奇怪的画面错乱artifacts。
核心代码逻辑
onFrame(..):相机帧输入后,先调用Skia完成渲染,再将生成的GL_TEXTURE_2D纹理渲染到输出SurfaceSkiaRenderer::renderFrame(..):将GL_TEXTURE_EXTERNAL_OES纹理转为Skia纹理,绘制图形后输出到绑定FBO1的GL_TEXTURE_2D离屏纹理OpenGLRenderer::renderTextureToSurface(..):将处理后的GL_TEXTURE_2D纹理渲染到目标EGLSurfacePassThroughShader::draw(..):使用sampler2D类型的直通着色器完成最终渲染
疑似问题方向
目前无法定位具体原因,怀疑是以下情况之一:
- Skia操作后未正确重置OpenGL纹理/帧缓冲(FBO)的绑定状态
- 内存资源未正确释放或复用导致的泄漏问题
- 着色器中采样器类型与纹理类型不匹配引发错误
- 相机帧的变换矩阵未在Skia渲染流程中正确应用
复现步骤
- 克隆指定PR分支
- 执行命令:
yarn && cd example && yarn - 在Android Studio中打开example/android项目
内容的提问来源于stack exchange,提问作者mrousavy
相关产品推荐
相关产品推荐

