使用 OpenGL 调整图像大小

Posted

技术标签:

【中文标题】使用 OpenGL 调整图像大小【英文标题】:Resizing an image using OpenGL 【发布时间】:2011-02-24 08:44:24 【问题描述】:

我想使用 OpenGL 调整图像的大小。我更喜欢 Java,但 C++ 也可以。

我对整个事情真的很陌生,所以这是我所看到的文字过程:

    将图像作为纹理加载到 OGL 中 设置一些关于状态和过滤的东西 将不同大小的纹理绘制到另一个纹理上 将纹理数据放入数组或其他东西中

您认为使用 OpenGL 和 GPU 是否比使用基于 CPU 的 BLIT 库更快?

谢谢!

【问题讨论】:

我认为它会更快。如果你经常这样做,瓶颈将是 GPURAM 链接。因此,如果您需要几种不同格式的相同图像,则只需将其加载到 VRAM 中一次,然后一次性生成所有图像即可。 我就是这么想的。但是,我仍然想知道如何做到这一点...... 我真的怀疑它会更快,原因与上面的评论相同 - 在 GPU 和 RAM 之间传输内容通常很慢。但愿意被证明是错误的:D 这很慢,除非您在屏幕外缓冲区中执行此操作。然后它超级快 请注意 OpenGL 2.0 之前的实现要求纹理的尺寸是 2 的幂(即 1、2、4、8、16,...) 【参考方案1】:

您可以简单地使用硬件 blit 功能,而不是将四边形渲染到目标 FBO:glBlitFramebuffer。它的论点直截了当,但需要仔细准备您的源和目标 FBO:

确保 FBO 完整 (glCheckFramebufferStatus) 独立设置读取 FBO 目标和写入 FBO 目标 (glBindFramebuffer) 设置绘制缓冲区和读取缓冲区 (glDraw/ReadBuffers) 调用glBlitFramebuffer,在参数中设置GL_LINEAR过滤器

我敢打赌它在 GPU 上会快得多,尤其是对于大图像。

【讨论】:

【参考方案2】:

取决于,如果图像很大,使用 OpenGL 可能会更快。但是,如果它只是进行调整大小的过程,而不是在 GPU 端进行更多处理,那么它是不值得的,因为它很可能会比 CPU 慢。

但是如果你需要调整图像的大小,并且可以在OpenGL中实现进一步的处理,那么是一个值得的想法。

【讨论】:

以上是关于使用 OpenGL 调整图像大小的主要内容,如果未能解决你的问题,请参考以下文章

调整 OpenGL 窗口的大小会导致它崩溃

OpenGL调整纹理/四边形

使用 OpenGL 和 SDL 处理窗口大小调整

使用 SDL 和 OpenGL 调整窗口大小

opengl:调整大小时如何将对象保留在窗口中

Qt 在另一个小部件中调整小部件的大小