Qt实现读取显示obj文件——创建并绑定纹理

13 篇文章 0 订阅
12 篇文章 0 订阅

之前在读取数据的时候,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开始生成纹理的名称,因为默认是一个纹理,所以使用的是数组的元素,如果你同时需要多个纹理对应一个面,那么传入数组即可~

在绑定后,我们在之后的刷新显示界面的时候将启动指定名称的纹理并将纹理坐标绘制进去即可!~

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值