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

问题描述 投票:1回答:1

我正在开发一个纯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芯片上:))
  • plain texture:不是缓冲区对象,不能映射到客户端进程内存

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

2d textures embedded-linux opengl-es-3.0 buffer-objects
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.