首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将图像加载到opengl纹理qt c++中

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

Stack Overflow用户
提问于 2017-03-26 15:49:50
回答 3查看 1.5K关注 0票数 0

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

代码语言:javascript
复制
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);
}

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

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-29 05:37:02

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

  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. 阿尔法组合很重要吗?也就是说,如果您删除glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE),它会有帮助吗?我想知道这是不是引起了一些不必要的骚动。也就是说,它要下载到主机,修改,然后发回或其他什么..。
  4. 我同意您应该删除glFinish();除非您有非常具体的理由。
  5. 你需要多久这么做一次?每一帧?
票数 1
EN

Stack Overflow用户

发布于 2017-03-26 16:02:14

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

票数 2
EN

Stack Overflow用户

发布于 2017-03-26 16:14:55

如何处理机顶盒图像加载器:它的原始像素数据在缓冲区中,它返回一个char指针到一个字节缓冲区,您可以使用它,并在加载到OpenGL后释放

代码语言:javascript
复制
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);

您可以在这里找到机顶盒:获取图像加载头:https://github.com/nothings/stb

使用mipmap进行绘图可以提高性能。

代码语言:javascript
复制
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glGenerateMipmap(GL_TEXTURE_2D);

祝好运

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43030916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档