我使用opengl调用Qt和c++,以便在屏幕上显示图像。为了将图像读取到纹理,我首先将其作为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);
}但是,在分析性能时,我怀疑这不是最有效的方法。对于我正在开发的应用程序来说,性能是至关重要的,我非常感谢关于如何改进这个部分的任何建议。(顺便说一句--读取图像是在一个单独的模块上完成的,而不是正在显示它的模块-是否可以读取并加载到纹理中,然后移动显示对象的纹理?)
谢谢
发布于 2017-03-29 05:37:02
如果不查看您的分析结果,很难说出来,但是有几件事需要尝试:
发布于 2017-03-26 16:02:14
把那个glFinish踢出去,它会大大降低性能,而你根本不需要它。
发布于 2017-03-26 16:14:55
如何处理机顶盒图像加载器:它的原始像素数据在缓冲区中,它返回一个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);您可以在这里找到机顶盒:获取图像加载头:https://github.com/nothings/stb
使用mipmap进行绘图可以提高性能。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glGenerateMipmap(GL_TEXTURE_2D);祝好运
https://stackoverflow.com/questions/43030916
复制相似问题