在Android中使用Kotlin和camera2。 在本节中如何将 image.hardwareBuffer 读取为 opengl 纹理?
val onImageAvailableListener = ImageReader.OnImageAvailableListener { reader ->
val image = reader.acquireLatestImage()
if(image != null && image.hardwareBuffer != null){
//read image.hardwareBuffer in opengl es 3.0
image.close()
}
}
搜索我认为需要的东西。
eglGetNativeClientBufferANDROID()
eglCreateImageKHR()
glEGLImageTargetTexture2DOES()
eglClientWaitSyncKHR()
哪些只能在 C++ 中使用? 有没有另一种更简单的方法而不使用c++? 如果没有,那么您可以编写一个示例,将这些函数放在一起以便能够读取 opengl es 3.0 着色器中的纹理吗?
最简单的选择是根本不使用 ImageReader,而是切换到 SurfaceTexture,它设计用于将帧读入 GPU。
如果这不可行,您需要确保 ImageReader.newInstance() 包含 USAGE_GPU_SAMPLED_IMAGE 标志。
然后您可以通过 Image.getHardwareBuffer() 将 Image 转换为 HardwareBuffer。 然后你可以将其包装在 EGL 纹理中;这可能必须在本机代码中完成,我找不到正确的 EGL 调用的快速参考。 但看起来您可能需要 eglCreateImageFromHardwareBuffer 和 glEGLImageTargetTexture2DOES 执行必要的步骤。
因此,如果可能的话,坚持使用 SurfaceTexture。