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

时间:2017-01-15 23:57:14

标签: 2d textures embedded-linux opengl-es-3.0 buffer-objects

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

我需要进行一些后期处理(添加另一层有一些blits),我的早期测试显示它可能是纯粹用CPU做的性能问题,这就是我需要GPU加速的原因(2D会好得多,但是在这些日子里不常见/便携......)。

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

据我所知,缓冲区对象可以通过glMapBufferRange()进行映射。我照顾了下面的可能性:

  • UNIFORM_BUFFER:太小而无法存储全屏图片

  • SHADER_STORAGE_BUFFER:仅支持ES 3.1

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

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

  • 像素缓冲区对象:我无法从着色器到达它们,在我看来,当我从中更新纹理时 进行复制。我不知道它是否比从客户端内存复制更快(考虑到它们都驻留在同一个RAM芯片上:))

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

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

1 个答案:

答案 0 :(得分:0)

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