ARCore Android Studio将过滤器添加到相机视图

ARCore Android Studio将过滤器添加到相机视图,android,camera,opengl-es-2.0,arcore,Android,Camera,Opengl Es 2.0,Arcore,我正在尝试在Android Studio SDK上向ARCore添加sobel边缘检测等过滤器 目前我正在使用 GLES20.glReadPixels(x, y, w, h, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, intBuffer); 要从GLSURFACHEVIEW中读取图像,请使用GPU image Android查看每一帧并添加过滤器 但它会导致性能问题,如帧下降,最终导致崩溃。 在ARCore中访问图像数据的最佳方式是什么 我看到ARCor

我正在尝试在Android Studio SDK上向ARCore添加sobel边缘检测等过滤器

目前我正在使用

GLES20.glReadPixels(x, y, w, h, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, intBuffer);
要从GLSURFACHEVIEW中读取图像,请使用GPU image Android查看每一帧并添加过滤器

但它会导致性能问题,如帧下降,最终导致崩溃。 在ARCore中访问图像数据的最佳方式是什么

我看到ARCore的BackgroundRenderer正在渲染摄影机视图,但我看不到它从何处获取摄影机纹理。
如何将过滤后的图像恢复到ARCore相机预览中?

目前还没有好的方法,就我个人而言,我希望他们尽快增加帧访问功能

在此期间,可能会帮助您捕获帧。我已经实现了PBO写入,并且我可以以每秒15帧的速度捕获帧,而不会有太多的可见延迟

目前,访问图像数据的最佳选择可能是将纹理绘制到renderbuffer,并使用glReadPixels将其放入持久映射的像素解压缩缓冲区。使用围栏同步来检测glReadPixels何时完成

另一种选择是使用计算着色器并直接写入持久映射的SSBO。(忽略持久映射建议。我认为
EXT\u buffer\u storage
有更广泛的支持)

后者的副本可能更少(即使在glReadPixels之后使其无效,renderbuffer像素仍可能命中DRAM),但它也是一种不太常见的代码路径,并且会导致渲染/计算转换,因此我无法直觉知道哪种方法更有效


您能否举例说明如何实现PBO写入?我使用的字节缓冲区如下:ByteBuffer buffer=ByteBuffer.allocate(宽*高*4);基本上就是我如何实现我的。不过,在第一次调用时,您需要某种init函数来创建OpenGL缓冲区。第9页有一些关于如何生成缓冲区的好例子。我已经成功地实现了PBO,但与没有PBO的glReadPixels()相比,我没有看到任何性能提升。我能在谷歌Pixel 2上实现每秒30帧的速度,无论有没有PBO。我现在没有在我的项目中使用fence sync,这可能是提高性能的一个因素吗@迪洛