繁体   English   中英

将图像加载到OpenGL纹理QT C ++

[英]Loading image to opengl texture qt c++

我正在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);
}

但是,在分析性能时,我怀疑这不是实现此目的的最有效方法。 对于我正在开发的应用程序,性能至关重要。对于如何改进此部分,我将不胜感激。 (顺便说一句-读取图像是在与显示图像的模块不同的模块上进行的-是否可以读取并加载到纹理,然后将纹理移动到显示对象上?)

谢谢

消除问题,当您根本不需要它时,它会严重降低性能。

如果不查看分析结果,很难说,但是要尝试一些方法:

  1. 您正在通过glTexImage2D()以GL_BGRA格式发送数据,并重新设置了驱动程序格式。 在对位进行预格式化时,它的工作速度更快吗?:(令人惊讶,但您永远不知道驱动程序在做什么。)

    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. 您需要多久执行一次此操作? 每帧?

关于STB图像加载器呢:它的原始像素数据在缓冲区中,它返回一个char指针指向 字节缓冲区 ,您可以在将其加载到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);

祝好运

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM