Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl es OpenGL ES对用户空间内存的渲染_Opengl Es_Powervr Sgx - Fatal编程技术网

Opengl es OpenGL ES对用户空间内存的渲染

Opengl es OpenGL ES对用户空间内存的渲染,opengl-es,powervr-sgx,Opengl Es,Powervr Sgx,我需要在带有PowerVR SGX硬件的ARM设备上实现对纹理的离屏渲染 一切都完成了(使用了pixelbuffers和OpenGLES2.0API)。唯一未解决的问题是glReadPixels的glReadPixels功能非常慢 我不是OpenGL ES的专家,所以我在问社区:有没有可能将纹理直接渲染到用户空间内存中?或者有什么方法可以获取纹理存储区域的硬件地址?其他技术(EGL扩展) 我不需要通用的解决方案,只需要为PowerVR硬件开发一个 更新:有关“慢速功能glReadPixels”的

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

一切都完成了(使用了pixelbuffers和OpenGLES2.0API)。唯一未解决的问题是glReadPixels的
glReadPixels
功能非常慢

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

我不需要通用的解决方案,只需要为PowerVR硬件开发一个

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

  • glReadPixels(0、0、宽度、高度、GL\u RGBA、GL\u无符号字节和arr)
    需要210毫秒
  • glReadPixels(0、0、宽度、高度、GL\u BGRA、GL\u无符号字节和arr)
    需要24毫秒(
    GL\u BGRA
    不是glReadPixels的标准,它是PoverVR扩展)
  • memcpy(&arr,&arr2,宽*高*4)
    需要5毫秒

对于更大的纹理,差异也更大。

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

如果您可以等待结果或将其延迟到下一帧,您可能再也看不到延迟了。OpenGL ES和PowerVr SGX支持它们

编辑: 请记住,GPU/CPU硬件在将数据从CPU端向GPU端单向移动方面进行了难以置信的优化。从GPU到CPU的反向路径通常要慢得多(这不是花费硬件资源的优先事项)。所以,你使用的技术(例如FBO/GetEximage)将要运行在这个限制之上。

解决了

如何强制OpenVR硬件渲染到用户分配的内存中:

例如,如何使用它:


在所有这些之后,我可以以5毫秒的速度获得渲染图像。

我在
glReadPixels
之前调用了
glFinish
,所以我确信这不是问题。此外,在此场景中:渲染图像,调用
glFinish
,测量
glReadPixels
调用,测量
glReadPixels
调用,测量
glReadPixels
调用。。。我有同样的价值观。每次调用
glReadPixels
都很慢,我可以将其渲染成FBO。但是如何从FBO获取渲染图像呢?唯一的方法(如我所见)是调用
glReadPixels
。我错了吗?glReadPixels从显示器读取。你应该使用glGetTexImage来获取纹理数据,作为fbo的颜色附件。@MārtiņšMožeiko很遗憾OpenGL ES没有glGetTexImage。@Justicle因为你自己说GPU到CPU的边界不能那么容易地跨越,fbo不会真的被他反对
glReadPixels
。OP要求“屏幕外渲染到纹理“。复制到CPU端是其中的一部分。FBO帮助完成第一部分。我可以问一下你需要客户端空间内存中的纹理做什么吗?也许你不需要纹理来离开GPU内存。请记住,当你只想使用纹理进行纹理处理时,你可以使用直接渲染成GPU纹理,这将使你的整个问题变得过时。不,我真的需要它。由于设备的工作,渲染的图像应该通过网络发送。qehgt我一直在阅读这个。。。使用CMem分配用户空间缓冲区和使用EGLImageKHR的主要技巧是什么?CMem-是的,EGLImageKHR-不确定。您需要在CMEM内存中分配一个“本机pixmap”,然后您可以非常快速地读/写这个pixmap。查看gleslayer应用程序的sgxsink_main.cpp文件中的
common\u create\u native\u pixmap
函数以了解详细信息。是的,这正是我正在使用的示例。最后一个简短的问题是,这个示例并没有真正对“reading”进行评论,但我假设我们可以访问cmem_alloc返回的地址(lAddress,注意不是pvAddress)处的内存。从这里我们可以简单地将memcpy存储到我们想要的位置吗?是的,您可以通过应用程序中的线性地址(当然不是物理地址)进行读/写。但是有很多小细节。例如,为了提高读/写操作的速度,您应该将CMEM的区域标记为“可缓存”,但之后需要手动刷新/使该区域无效。诸如此类。我对嵌入式系统非常陌生,通常专注于算法,我在哪里可以读到“等等”,并将物理内存标记为可缓存的,初步的谷歌搜索并没有指导我。有一点背景,我正在做一个GPGPU应用程序,需要在1920x1080和2bpp下以30 fps(或接近30 fps)的速度运行,这不是要在缓存中存储很多吗?