如何从OpenGL加载图像?

Posted

技术标签:

【中文标题】如何从OpenGL加载图像?【英文标题】:How to load image BACK from OpenGL? 【发布时间】:2011-10-27 18:29:24 【问题描述】:

我已成功将图像作为纹理加载到 OpenGL(我使用 GTKmm 库中的 Gdk::Pixbuf),但我不知道如何从 OpenGL 获取修改后的图像并将其加载到 Gdk::Pixbuf...

我想在 OpenGL 中修改图像并将它们保存在硬盘上。

有一些代码:

Glib::RefPtr<Gdk::Pixbuf> pixmap = Gdk::Pixbuf::create_from_file("image.jpg");
GLuint texture[1];
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pixmap->get_width(), pixmap->get_height(), 0,      GL_RGB, GL_UNSIGNED_BYTE, pixmap->get_pixels() );

【问题讨论】:

欢迎来到 ***,希望您阅读FAQ。 【参考方案1】:

将带纹理的四边形渲染到帧缓冲区,然后再渲染glReadPixels()

【讨论】:

由于他没有标记 OpenGL ES,因此绘制纹理四边形并不是仅使用 glGetTexImage 的好选择。 @ChristianRau:但是由于 OP 说“想在 OpenGL 中修改图像”,glGetTexImage 可能不是想要的,因为它只会读回之前上传的纹理图像(这是一个我从来不明白它们为什么存在的功能)。正如 genpfault 所建议的那样,要读回“修改”的内容,需要绘制带纹理的四边形(带有某种“操作”,可能是着色器)。 @Damon 可以使用渲染到纹理来修改纹理数据,即渲染到带有纹理的帧缓冲区。因此,在某些情况下,读回纹理数据确实有意义。 @Gigo:也许,这很难说,因为我们不知道 OP 想要什么(“修改”不是很具体)。当然,你可以例如在现有图像上绘制一些几何图形,这很好。但是“修改图像”的通常想法是不同的,它通常涉及读取图像并应用某种卷积等。读取和写入同一个图像是未定义的(除了使用原子操作,它们很慢,或者使用带有供应商扩展的显式同步)。这通常意味着你会想要读回一个不同的纹理,而不是同一个。【参考方案2】:

只要你不使用OpenGL ES,而是真正的桌面OpenGL,你就可以使用glGetTexImage

【讨论】:

【参考方案3】:

如果你想避免draw call,你可以创建一个framebuffer并将纹理附加到一个颜色附件,然后使用glReadPixels

【讨论】:

以上是关于如何从OpenGL加载图像?的主要内容,如果未能解决你的问题,请参考以下文章

翻转OpenGL纹理

如何使用 OpenGL 加载 8 位 bmp?

在 iOS 上从两个 jpeg 加载 RGBA 图像 - OpenGL ES 2.0

如何在 1D 缓冲区中生成 2D 纹理并将其加载到 OpenGL 中?

图像加载导致 OpenGL 中的处理缓慢

OpenGL-载入纹理