我在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 - 读取图像是在一个单独的模块上完成的,而不是显示它的模块 - 是否可以读取并加载到纹理,然后将纹理移动到显示对象?)
谢谢
答案 0 :(得分:2)
踢出那个glFinish,它会大大降低你的性能而你根本不需要它。
答案 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());
您是否从磁盘上的文件中填充了QImage?它有多大?如果图像数据的绝对数量是问题,并且它是静态纹理,您可以尝试离线压缩图像为DXT / St3格式并保存以供日后使用。然后在运行时读取并上传这些位。这将减少传输到GPU(并存储在GPU内存中)的字节数为原始的1/6或1/4。如果你需要在运行时生成QImage并且无法预压缩,那么这可能会减慢速度,所以请记住这一点。
alpha组合重要吗?即如果你删除glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);它有帮助吗?我想知道这是否会导致一些不必要的流失。即它被下载到主机,修改,然后发回或其他东西......
我同意你应该删除glFinish();除非你有非常具体的理由。
您多久需要这样做?每一帧?
答案 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
后生成mipmapglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glGenerateMipmap(GL_TEXTURE_2D);
祝你好运