版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sx341125/article/details/62889214
之前在读取数据的时候,Qt实现读取显示obj文件——读取数据,已经读取纹理,也就是png格式的文件到model的集合中去了,我们需要根据图片创建我们的纹理:
for (int i = 0; i < model->list_ImagePath.length(); i++)
{
glEnable(GL_TEXTURE_2D);
GLint MaxTextureSize;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &MaxTextureSize);
QImage img, imgScaled, imgGL;
QFileInfo fi(model->list_ImagePath[i]);
QString imagePath = fi.absoluteFilePath();
imagePath = imagePath.trimmed();
bool res = img.load(imagePath);
if (res)
{
int bestW = RoundUpToTheNextHighestPowerOf2(img.width());//计算最接近宽度的2的幂,如1024
int bestH = RoundUpToTheNextHighestPowerOf2(img.height());
while (bestW > MaxTextureSize) bestW /= 2;
while (bestH > MaxTextureSize) bestH /= 2;
imgScaled = img.scaled(bestW, bestH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
imgGL = convertToGLFormat(imgScaled);//该方法是QGLWidget插件独有的方法,所以该方法是在你的QGLWidget中实现的
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, (GLuint*)&(model->textureArray[i]));//创建
glBindTexture(GL_TEXTURE_2D, (GLuint)model->textureArray[i]);//绑定
glTexImage2D(GL_TEXTURE_2D, 0, 3, imgGL.width(), imgGL.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, imgGL.bits());
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, imgGL.width(), imgGL.height(), GL_RGBA, GL_UNSIGNED_BYTE, imgGL.bits());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}
glDisable(GL_TEXTURE_2D);
}
这里glGenTextures方法会自动从1开始生成纹理的名称,因为默认是一个纹理,所以使用的是数组的元素,如果你同时需要多个纹理对应一个面,那么传入数组即可~
在绑定后,我们在之后的刷新显示界面的时候将启动指定名称的纹理并将纹理坐标绘制进去即可!~