4

我需要在带有 PowerVR SGX 硬件的 ARM 设备上实现离屏渲染到纹理。

一切都完成了(使用了像素缓冲区和 OpenGL ES 2.0 API)。唯一未解决的问题是 glReadPixels功能非常缓慢。

我不是 OpenGL ES 方面的专家,所以我问社区:是否可以将纹理直接渲染到用户空间内存中?或者可能有一些方法可以获得纹理内存区域的硬件地址?其他一些技术(EGL 扩展)?

我不需要一个通用的解决方案,只需要一个适用于 PowerVR 硬件的解决方案。

更新:有关“慢功能”的更多信息glReadPixels。将 512x512 RGB 纹理数据复制到 CPU 的内存:

  • glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, &arr)需要 210 毫秒,
  • glReadPixels(0, 0, WIDTH, HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, &arr)需要 24 毫秒(GL_BGRA不是 glReadPixels 的标准,它是 PoverVR 扩展),
  • memcpy(&arr, &arr2, WIDTH * HEIGHT * 4)需要 5 毫秒

在纹理更大的情况下,差异也更大。

4

3 回答 3

4

解决了。

如何强制 OpenVR 硬件渲染到用户分配的内存中:http: //processors.wiki.ti.com/index.php/Render_to_Texture_with_OpenGL_ES#Pixmaps

一个例子,如何使用它: https ://gforge.ti.com/gf/project/gleslayer/

毕竟,我可以将渲染图像的速度提高到 5 毫秒。

于 2012-02-29T14:34:39.573 回答
0

当你调用 opengl 函数时,你是在渲染队列中排队命令。这些命令由 GPU 异步执行。当您调用 glReadPixels 时,cpu 必须等待 gpu 完成其渲染。因此,呼叫可能正在等待该平局结束。在大多数硬件上(至少是我工作的那些),内存由 cpu 和 gpu 共享,所以如果渲染完成,读取像素不应该那么慢。

如果您可以等待结果或将其推迟到下一帧,您可能不会再看到该延迟

于 2012-02-27T21:10:37.423 回答
0

帧缓冲区对象是您正在寻找的。它们在 OpenGL ES 和 PowerVr-SGX 上受支持

编辑:请记住,GPU/CPU 硬件在从 CPU 端到 GPU 端的一个方向移动数据方面进行了难以置信的优化。从 GPU 到 CPU 的反向路径通常要慢得多(这不是花费硬件资源的优先事项)。因此,无论您使用什么技术(例如 FBO/getTexImage),您都将违反此限制。

于 2012-02-27T21:11:44.340 回答