OpenGL 中的 Blitting 表面

Blitting surfaces in OpenGL

两者 SDL and Game Maker 都有表面的概念,您可以即时修改并显示它们的图像。我正在使用 OpenGL 1,我想知道 openGL 是否有表面这个概念。

我想到的唯一方法是:

这些方法的性能似乎不是很好,但我看不出有其他选择。也许这就是它们在提到的引擎中的实现方式。

是的,这两种是您在 OpenGL 1.0 中执行此操作的方法。就 1.0 规范而言,我认为没有任何其他方法。 Link : https://www.opengl.org/registry/doc/glspec10.pdf

请注意,纹理存储在设备内存 (GPU) 中,可以快速访问以进行着色。并且上述方法在主机(CPU)内存和设备内存之间复制它。因此,性能受到的影响是主机设备复制的速度。

为什么您仅限于 OpenGL 1.0 规范。你可以走得更高,然后开始获得更多选择。

  1. 使用 GLSL 着色器直接编辑一个纹理的内容并将其输出到另一个纹理。处理将在 GPU 上完成,设备到设备的复制会尽可能快。
  2. 使用CUDA。将纹理映射到 CUDA 数组,使用内核修改内容。或者对非 NVIDIA 卡使用 OpenCL。

只要修改可以并行执行,这将是更好的方案。

我建议尝试 CPU 复制方法,因为它的速度可能足以满足您的需要。使用最新的硬件,主机设备副本变得越来越快。即使使用此副本,您也可能可以获得实时 60fps 或更高的帧率,除非您计划为其执行此操作的纹理很多。