基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(四)纹理

本篇目的是在Qt中学习使用QOpenGLTexture类绑定纹理,分别生成普通纹理,混合纹理与在shader中使用纹理单元。

Vries的原教程地址如下,https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/ 关于函数的具体解析请看这个教程,本篇旨在对Vires思想做Qt平台的移植)

一.生成普通纹理

将木箱纹理读进OpenGL。如下图所示

与Vries所使用的外库stb_image.h相比,Qt对opengl的纹理做了极棒的优化,使用QOpenGLTexture类,

可以省略非常多麻烦的步骤。一下是Vries生成纹理的步骤,(emmmmm,又难记,有麻烦)

在Qt里,使用QOpenGlTexture类对象texture,我对每一条功能进行了还原,寥寥几步,QOpenGLTexture类还原起来很舒服。

    texture = new QOpenGLTexture(QImage(":/textures/res/textures/container.jpg").mirrored(), QOpenGLTexture::GenerateMipMaps); //直接生成绑定一个2d纹理, 并生成多级纹理MipMaps
    if(!texture->isCreated()){
        qDebug() << "Failed to load texture" << endl;
    }
    texture->setWrapMode(QOpenGLTexture::DirectionS, QOpenGLTexture::Repeat);// 等于glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    texture->setWrapMode(QOpenGLTexture::DirectionT, QOpenGLTexture::Repeat);//    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    texture->setMinificationFilter(QOpenGLTexture::Linear);   //等价于glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    texture->setMagnificationFilter(QOpenGLTexture::Linear);  //     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    texture->setFormat(QOpenGLTexture::RGBFormat); //将纹理储存为rgb值

项目组织结构及源代码如下:

将木箱图片作为资源文件进行管理。相对与上篇教程,仅改动了widget.h widget.cpp 与.vert和.frag文件

 

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QOpenGLWidget>
#include <QDebug>
#include <QOpenGLFunctions_3_3_Core>
#include "shader.h"
#include <QOpenGLTexture>  //新添项

class Triangle : public QOpenGLWidget
{
public:
    Triangle();
    GLuint a;
    ~Triangle();
protected:
    virtual void initializeGL();
    virtual void resizeGL(int w, int h);
    virtual void paintGL();
private:
    Shader *ourShader;
    QOpenGLTexture *texture;//新添项
    QOpenGLFunctions_3_3_Core *core;

};

#endif // WIDGET_H

widget.cpp

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值