使用QImage为OpenGL 4.5创建纹理

时间:2018-10-25 15:15:04

标签: c++ opengl qt5

这个question似乎是在问一个确切的问题,但在2011年被问到使用的QGLWidget是一种过时的方法,具有固定的管道。

当使用QImage这样的纹理图像看上去已损坏时,我得到的结果不正确。显然,出现了问题,并且未以预期的RGB格式返回位。在这种使用情况下,如何正确使用QImage?

QImage img(texture.file_path.c_str());
unsigned char* actual_texture_img = img.bits();
int width = img.width();
int height = img.height();

if (!actual_texture_img) {
    return -1;
}

GLuint texture_id;
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, actual_texture_img);

glGenerateMipmap(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D, 0);

具有错误纹理的图像样本:

Incorrect texture loading

1 个答案:

答案 0 :(得分:0)

我已经确定了解决方法。有趣的是,QT 5.11中的QImage(也许在其他版本中也是如此)默认情况下以32位ARGB格式加载图像。因此,我期望将RGB 24位格式或RGB_888作为glTexImage2D的输入。简单的解决方法是使用QImage函数convertToFormat转换图像,如下所示:

    img = img.convertToFormat(QImage::Format_RGB888);

这是我的openGL格式的情况,GL_RGB与加载的格式不匹配。