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

发布于 2024-07-20 05:32:01 字数 440 浏览 11 评论 0原文

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

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

我考虑过两个选项,但我不确定其中一个是否那么好:

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

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

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

I'm writing a drawing application, and the drawing canvas is an OpenGL texture. When you draw onto the canvas, it determines which region of the canvas texture has been changed, and copies that pixel data out (using glReadPixels) before applying the changes you made.

To undo, I want to simply revert to the previous texture state using that pixel data that was copied out. However, OpenGL ES doesn't provide a glDrawPixels command. What's the best way to do it?

I've considered two options, but I'm not sure either is that great:

  1. Create a temporary texture using the pixels I copied out and draw that in. (However, copied region is not a power of two!)

  2. Unbind the large canvas texture completely, manually alter the bytes of the texture, and then put it back into OpenGL. I'm not using any sort of compression, so this might not be that bad. But it seems like a hack?

Anybody have any ideas? I'd really appreciate it!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

雨夜星沙 2024-07-27 05:32:01

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

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

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

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

In case anyone stumbles across this while trying to do something similar, I've come up with a solution that seems to work well.

  1. Grab an image of the current texture by binding it to the framebuffer and then writing the framebuffer to a CGImageRef.
  2. Create a new CGContext and draw in the existing texture CGImageRef. Then draw old texture data in to the portion that the user changed, effectively "undoing" that change to the image.
  3. Destroy old OpenGL texture and create a texture from the CGContext.

I think this is a pretty slow way of going about things, but I don't need huge performance - my real concern was limiting the amount of data being kept to represent the "old" texture.

If you need help with this (there's quite a bit of code) feel free to email me.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文