1

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

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

我考虑了两种选择,但我不确定是否有那么好:

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

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

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

4

1 回答 1

1

万一有人在尝试做类似的事情时偶然发现了这一点,我想出了一个似乎运作良好的解决方案。

  1. 通过将其绑定到帧缓冲区然后将帧缓冲区写入 CGImageRef 来获取当前纹理的图像。
  2. 创建一个新的 CGContext 并在现有的纹理 CGImageRef 中绘制。然后将旧纹理数据绘制到用户更改的部分,有效地“撤消”对图像的更改。
  3. 销毁旧的 OpenGL 纹理并从 CGContext 创建一个纹理。

我认为这是一种相当缓慢的处理方式,但我不需要巨大的性能——我真正关心的是限制为表示“旧”纹理而保留的数据量。

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

于 2009-05-22T02:33:33.170 回答