我实现了在Mali-400 gpu上运行的opengl-es应用程序。 我从相机上抓取1280x960 RGB缓冲区,然后使用glTexImage2D在gpu上渲染。
但是,对于1280x960分辨率的帧,glTexImage2D调用大约需要25毫秒。它会额外复制pCameraBuffer。
1)有什么方法可以改善glTexImage2D的性能吗? 2)FBO有帮助吗?如何使用帧缓冲区对象进行渲染。我发现了几个FBO示例,但是我看到这些示例在最后一个参数(数据)中将NULL传递给glTexImage2d。那么如何用FBO渲染pCameraBuffer?
下面是为每个摄像机帧运行的代码。
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCENE_WIDTH, SCENE_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, pCameraBuffer);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDeleteTextures(1, &textureID);
答案 0 :(得分:0)
这类事情的通常方法是尝试将相机缓冲区直接导入图形驱动程序,而根本不需要进行任何内存分配或复制。是否支持此功能在很大程度上取决于平台集成以及系统中驱动程序的功能。
对于Linux系统(即您正在使用的系统),路由是通过EGL_EXT_image_dma_buf_import
扩展名。您需要一个摄像头驱动程序,该驱动程序创建一个由dma_buf受管内存支持的表面,以及一个辅助通道,以将dma_buf文件句柄放入运行图形操作的应用程序中。然后,您可以使用上面的扩展名将其转换为EGLImage。