0

我实现了一个在 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);
4

1 回答 1

0

处理这类事情的常用方法是尝试将相机缓冲区直接导入图形驱动程序,从而完全避免任何内存分配或复制。是否支持这在很大程度上取决于平台集成以及系统中驱动程序的功能。

对于您表示正在使用的 Linux 系统,路由是通过EGL_EXT_image_dma_buf_import扩展。您需要一个相机驱动程序来创建由 dma_buf 托管内存支持的表面,以及一个将 dma_buf 文件句柄获取到运行图形操作的应用程序的侧通道。然后,您可以使用上面的扩展将其转换为 EGLImage。

于 2019-07-04T18:58:15.053 回答