2d OpenGL ES 3.0:零拷贝CPU渲染到纹理?

2d OpenGL ES 3.0:零拷贝CPU渲染到纹理?,2d,textures,embedded-linux,opengl-es-3.0,buffer-objects,2d,Textures,Embedded Linux,Opengl Es 3.0,Buffer Objects,我正在处理一个纯2D项目,其中屏幕由CPU渲染,我想将其显示为纹理,但我不想为每个帧上载整个图像。我不知道哪些部分被更改了,所以我假设整个图像是无效的 我需要做一些后处理(添加另一个带有一些BLIT的层),我的早期测试表明,纯粹使用CPU可能会出现性能问题,这就是为什么我需要GPU accel(2D会更好,但在这些日子里并不常见/可移植…) 我的目标平台是一个嵌入式系统(ARM),其中GPU和CPU共享内存,因此理论上我可以在没有任何拷贝的情况下完成这项工作。所选平台支持OpenGL 2.1和O

我正在处理一个纯2D项目,其中屏幕由CPU渲染,我想将其显示为纹理,但我不想为每个帧上载整个图像。我不知道哪些部分被更改了,所以我假设整个图像是无效的

我需要做一些后处理(添加另一个带有一些BLIT的层),我的早期测试表明,纯粹使用CPU可能会出现性能问题,这就是为什么我需要GPU accel(2D会更好,但在这些日子里并不常见/可移植…)

我的目标平台是一个嵌入式系统(ARM),其中GPU和CPU共享内存,因此理论上我可以在没有任何拷贝的情况下完成这项工作。所选平台支持OpenGL 2.1和OpenGL ES 3.0

我知道缓冲区对象可以通过glMapBufferRange进行映射​(). 我考虑了以下可能性:

  • 统一缓冲区:太小,无法存储全屏图像

  • 着色器\存储\缓冲区:仅支持ES 3.1

  • 着色器图像加载存储:仅支持ES 3.1

  • 缓冲区纹理:ES 3.0不支持(受???支持)

  • 像素缓冲区对象:我无法从着色器访问它们,而且在我看来,当我从中更新纹理时,它确实会复制。我不知道它是否比从客户机内存复制快(考虑到它们都位于同一个RAM芯片上:)

  • 普通纹理:不是缓冲区对象,无法映射到客户端进程内存


我错过什么了吗?在ES 3.0中,无法与包含大量数据的GPU共享缓冲区。我可以从CPU写入数据,也可以从片段着色器读取数据。

您可以使用
GLES20.glTexSubImage2D
部分更改纹理。

您可以使用
GLES20.glTexSubImage2D
部分更改纹理