将图像加载到opengl纹理qt c ++

时间:2017-03-26 15:49:50

标签: c++ performance qt opengl

我在Qt上用c ++使用opengl调用,以便在屏幕上显示图像。为了将图像添加到纹理中,我首先将其作为QImage读取,然后使用以下代码加载到纹理:

void imageDisplay::loadImage(const QImage &img){
    glEnable(GL_TEXTURE_2D); // Enable texturing
    glBindTexture(GL_TEXTURE_2D, texture); // Set as the current texture
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, img.width(),
                  img.height(),
                  0, GL_BGRA,      GL_UNSIGNED_BYTE, img.bits() );
    glFinish();
    glDisable(GL_TEXTURE_2D);
}

但是,在分析性能时,我怀疑这不是最有效的方法。性能对于我正在开发的应用程序至关重要,我非常感谢有关如何改进此部分的任何建议。 (BTW - 读取图像是在一个单独的模块上完成的,而不是显示它的模块 - 是否可以读取并加载到纹理,然后将纹理移动到显示对象?)

谢谢

3 个答案:

答案 0 :(得分:2)

踢出那个glFinish,它会大大降低你的性能而你根本不需要它。

答案 1 :(得分:1)

如果不查看您的分析结果,很难说,但有几件事要尝试:

  1. 您正在通过GL_BGRA格式的glTexImage2D()发送数据并重新格式化驱动程序。当你预先格式化这些位时,它能更快地运行吗?:(会很奇怪,但你永远都不知道驱动程序会做什么。)

    QImage imageUpload = imageOriginal.convertToFormat(QImage :: Format_ARGB32).rgbSwapped(); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,image.width(),image.height(),0,GL_RGBA,GL_UNSIGNED_BYTE,image.bits());

  2. 您是否从磁盘上的文件中填充了QImage?它有多大?如果图像数据的绝对数量是问题,并且它是静态纹理,您可以尝试离线压缩图像为DXT / St3格式并保存以供日后使用。然后在运行时读取并上传这些位。这将减少传输到GPU(并存储在GPU内存中)的字节数为原始的1/6或1/4。如果你需要在运行时生成QImage并且无法预压缩,那么这可能会减慢速度,所以请记住这一点。

  3. alpha组合重要吗?即如果你删除glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);它有帮助吗?我想知道这是否会导致一些不必要的流失。即它被下载到主机,修改,然后发回或其他东西......

  4. 我同意你应该删除glFinish();除非你有非常具体的理由。

  5. 您多久需要这样做?每一帧?

答案 2 :(得分:-1)

STB图像加载器怎么样: 它在缓冲区中的原始像素数据,它将字符串指针返回到字节缓冲区,您可以使用它,并在加载到OpenGL后发布

int width, height comp;
unsigned char *data = stbi_load(filename, &width, &height, &comp, 4); // ask it to load 4 components since its rgba  // demo only

    glGenBuffers(1, &m_vbo);
    glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
    glBufferData(GL_ARRAY_BUFFER, vertexByteSize), this->Vertices, GL_STATIC_DRAW);
    glGenTexture(...)
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D( ... );

    // you can generate mipmaps here

    // Important
    stbi_image_free(data);

你可以在这里找到STB:获取图像加载头: https://github.com/nothings/stb

使用openGL绘制mipmap可以提高性能。 使用glTexImage2D

后生成mipmap
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glGenerateMipmap(GL_TEXTURE_2D);
祝你好运