本篇目的是在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