OpenGL ES渲染到用户空间内存

时间:2012-02-27 21:02:17

标签: opengl-es powervr-sgx

我需要在使用PowerVR SGX硬件的ARM设备上实现屏幕外渲染纹理。

一切都已完成(使用了pixelbuffers和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毫秒

如果纹理较大,差异也会更大。

3 个答案:

答案 0 :(得分:4)

解决。

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

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

在完成所有这些之后,我可以将渲染图像的速度提高到5毫秒。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

Frame buffer objects正是您要找的。它们在OpenGL ES和PowerVr-SGX

上受支持

编辑: 请记住,GPU / CPU硬件非常优化,可以在一个方向上将数据从CPU端移动到GPU端。从GPU到CPU的反向路径通常要慢得多(它不是花费硬件资源的优先级)。那么你使用什么技术(例如FBO / getTexImage)你将会遇到这个限制。