我正在做一个纯 2D 项目,屏幕由 CPU 渲染,我想将其显示为纹理,但我不想为每一帧上传整个图像。我不知道哪些部分发生了变化,所以我认为整个图像是无效的。
我需要做一些后期处理(添加另一个带有一些 blit 的层),我的早期测试表明这可能是纯粹使用 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 写入和从片段着色器读取的大量数据?