c++ - OpenGL 纹理占用太多内存

标签 c++ qt opengl

我有 75 * 9 * 32 张图像,PNG 格式的硬盘驱动器总共有 64 MB。如果我加载每张 128*256 像素的图像,它会在 RAM 中占用高达 1.5 GB 的内存!我没有启用 mipmapping。

我想这可能是因为 GPU 只存储原始图像,有没有办法减少内存使用量?

我正在使用只创建一次的帧缓冲区对象加载纹理。

我使用以下方法加载纹理:

        QImage catchImage = catchFbo->toImage();
        QImage t = QGLWidget::convertToGLFormat(catchImage);

        glGenTextures( 1, &Item::texture[i] );
        glBindTexture( GL_TEXTURE_2D, Item::texture[i] );
        glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits() );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );

编辑:GL_COMPRESSED_RGBA 而不是 GL_RGBA 似乎有很大的不同。它现在使用 500 MB。

最佳答案

I am figuring this could be because the GPU only stores raw images,

当然,它们是原始格式。尽管 GPU 直接支持 Deflate 和 JPEG 解压缩会很好,但它们不支持。

is there a way to tighten the memory usage?

您可以使用压缩纹理格式。是的,现代 GPU 确实支持即时解压缩,但使用的编解码器与 PNG 或 JPEG 有很大不同。

I am loading the textures with the use of a framebuffer object, which is created only once.

为什么? FBO 用于其他用途。您可以直接从文件加载 QImage 而无需此类代理。

关于c++ - OpenGL 纹理占用太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10209290/

相关文章:

OpenGL:旧 ATI 卡上的 "Fragment Shader not supported by HW"

opengl - 我可以在OpenGL中将VAO设置在VBO之前吗?

c++ - 这个 vector 编码有什么问题?(初学者)

c++ - MacOS 上Qt GUI Widget 大小异常

c++ - Qt错误涉及清洁项目未修复的MOC文件

c++ - 停靠时不应用 QDockWidget::background-color

c++ - 是否有语法来防止类的实例是常量?

c++ - 为什么使用 std::vector 而不是 realloc?

c++ - 为什么派生类中复制/移动函数的 "normal"实现会根据它们的定义方式表现不同?

c - 如何在 opengl/SDL 中使用 ARGB 颜色?