将任意大小的像素块复制到OpenGL ES纹理......不知何故?

时间:2009-05-21 18:41:31

标签: opengl-es copy textures gldrawpixels

我正在编写绘图应用程序,绘图画布是OpenGL纹理。当您在画布上绘制时,它会确定画布纹理的哪个区域已更改,并在应用您所做的更改之前将该像素数据复制出来(使用glReadPixels)。

要撤消,我想简单地使用复制出来的像素数据恢复到之前的纹理状态。但是,OpenGL ES不提供glDrawPixels命令。最好的方法是什么?

我考虑过两种选择,但我不确定这两种选择是否很好:

  1. 使用我复制出来的像素创建一个临时纹理并将其绘制成。(但是,复制的区域不是2的幂!)

  2. 完全取消绑定大画布纹理,手动更改纹理的字节,然后将其放回OpenGL中。我没有使用任何压缩,所以这可能不是那么糟糕。但它似乎是一个黑客?

  3. 有人有什么想法吗?我真的很感激!

1 个答案:

答案 0 :(得分:1)

如果有人在尝试做类似的事情时遇到这种情况,我会想出一个似乎运作良好的解决方案。

  1. 通过将当前纹理绑定到帧缓冲区然后将帧缓冲区写入CGImageRef来抓取当前纹理的图像。
  2. 创建一个新的CGContext并在现有纹理CGImageRef中绘制。然后将旧纹理数据绘制到用户更改的部分,有效地“撤消”对图像的更改。
  3. 销毁旧的OpenGL纹理并从CGContext创建纹理。
  4. 我认为这是处理事情的一种非常缓慢的方式,但我不需要巨大的性能 - 我真正关心的是限制保留的数据量以代表“旧”纹理。

    如果您需要帮助(有相当多的代码),请随时给我发电子邮件。