运行截图如下图:

代码如下:

myglwidget.h

#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLBuffer>class QOpenGLTexture;
class QOpenGLShaderProgram;class MyGLWidget:public QOpenGLWidget,protected QOpenGLFunctions
{Q_OBJECT
public:MyGLWidget(QWidget *parent=0);protected:void initializeGL();void paintGL();void resizeGL(int w, int h);void keyPressEvent(QKeyEvent *evnet);private:QOpenGLShaderProgram *program;QOpenGLBuffer vbo;QOpenGLTexture *textures[6];GLfloat translate,xRot,yRot,zRot;
};#endif // MYGLWIDGET_H

myglwidget.cpp

#include "myglwidget.h"
#include <QOpenGLShaderProgram>
#include <QOpenGLTexture>
#include <QDebug>
#include <QKeyEvent>MyGLWidget::MyGLWidget(QWidget *parent):QOpenGLWidget(parent)
{translate = -6.0;xRot = zRot = 0.0;yRot = -30.0;
}void MyGLWidget::initializeGL(){initializeOpenGLFunctions();glEnable(GL_DEPTH_TEST);for(int i=0; i<6; ++i){textures[i] = new QOpenGLTexture(QImage(QString(":/img/side%1.png").arg(i+1)).mirrored());}QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex,this);const char *vsrc ="#version 130\n""in vec4 vPosition;                         \n""in vec2 vTexCoord;                         \n""out vec2 texCoord;                         \n""uniform mat4 matrix;                       \n""void main() {                              \n""    texCoord = vTexCoord;                  \n""    gl_Position = matrix * vPosition;      \n""}\n";vshader->compileSourceCode(vsrc);QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment,this);const char *fsrc ="#version 130\n""uniform sampler2D tex;                     \n""in vec2 texCoord;                          \n""out vec4 fColor;                           \n""void main() {                              \n""    fColor = texture(tex, texCoord);       \n""}\n";fshader->compileSourceCode(fsrc);program = new QOpenGLShaderProgram;program->addShader(vshader);program->addShader(fshader);program->link();program->bind();
}void MyGLWidget::paintGL(){int w = width();int h = height();int side = qMin(w,h);glViewport((w-side)/2,(h-side)/2,side,side);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);GLfloat vectices[6][4][3]={{{1.0f,1.0f,1.0f},{1.0f,1.0f,-1.0f},{1.0f,-1.0f,-1.0f},{1.0f,-1.0f,1.0f}},{{-1.0f,1.0f,1.0f},{-1.0f,1.0f,-1.0f},{-1.0f,-1.0f,-1.0f},{-1.0f,-1.0f,1.0f}},{{1.0f,1.0f,1.0f},{-1.0f,1.0f,1.0f},{-1.0f,1.0f,-1.0f},{1.0f,1.0f,-1.0f}},{{1.0f,-1.0f,1.0f},{-1.0f,-1.0f,1.0f},{-1.0f,-1.0f,-1.0f},{1.0f,-1.0f,-1.0f}},{{1.0f,1.0f,1.0f},{1.0f,-1.0f,1.0f},{-1.0f,-1.0f,1.0f},{-1.0f,1.0f,1.0f}},{{1.0f,1.0f,-1.0f},{1.0f,-1.0f,-1.0f},{-1.0f,-1.0f,-1.0f},{-1.0f,1.0f,-1.0f}},};GLfloat coords[6][4][2] ={{ {0.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f} },{ {0.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f} },{ {0.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f} },{ {0.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f} },{ {0.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f} },{ {0.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f} },};vbo.create();vbo.bind();vbo.allocate((72+48)*sizeof(GLfloat));vbo.write(0,vectices,72*sizeof(GLfloat));GLuint vPosition = program->attributeLocation("vPosition");program->setAttributeBuffer(vPosition,GL_FLOAT,0,3,0);glEnableVertexAttribArray(vPosition);vbo.write(72* sizeof(GLfloat), coords, 48*sizeof(GLfloat));GLuint vTexCoord = program->attributeLocation("vTexCoord");program->setAttributeBuffer(vTexCoord, GL_FLOAT, 72* sizeof(GLfloat), 2, 0);glEnableVertexAttribArray(vTexCoord);program->setUniformValue("tex", 0);QMatrix4x4 matrix;matrix.perspective(45.0f, (GLfloat)w / (GLfloat)h, 0.1f, 100.0f);matrix.translate(0, 0, translate);matrix.rotate(xRot, 1, 0, 0);matrix.rotate(yRot, 0, 1, 0);matrix.rotate(zRot, 0, 0, 1);program->setUniformValue("matrix",matrix);for(int i=0; i<6; i++) {textures[i]->bind();glDrawArrays(GL_TRIANGLE_FAN, i*4, 4);}
}void MyGLWidget::resizeGL(int w, int h){}void MyGLWidget::keyPressEvent(QKeyEvent *event)
{switch (event->key()) {case Qt::Key_Up:xRot += 10;break;case Qt::Key_Left:yRot += 10;break;case Qt::Key_Right:zRot += 10;break;case Qt::Key_Down:translate -= 1;break;case Qt::Key_Space:translate += 1;break;default:break;}update();QOpenGLWidget::keyPressEvent(event);
}

main.cpp

#include <QApplication>
#include "myglwidget.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);MyGLWidget w;w.resize(800,600);w.show();return a.exec();
}

Qt学习笔记-OpenGL做正方体并旋转相关推荐

  1. Qt学习笔记,Qt程序架构设计要旨

    Qt学习笔记,Qt程序架构设计要旨 时间过得很快,转眼学习Qt已经有一个多月了,对Qt的学习也在不断的深入中.自己手下的code也很多了,不过不得不说,还有很多的部分没有接触过,比如网络编程,2D,3 ...

  2. Qt学习笔记之数据库

    一.数据库简介 1.1.数据和数据库(DB) 用计算机进行数据处理,首先就要把信息以数据形式存储到计算机中,故数据是可以被计算机接受和处理的符号.根据所表示的信息特征不同,数据有不同的类别,如数字.文 ...

  3. QT学习笔记(四):Qt5+MSVC编译 中文字符显示乱码问题解决

    QT学习笔记(四):Qt5+MSVC编译 中文字符显示乱码问题解决 问题: 1.解决方法一: 2.解决方法二: 3.解决方法三: 4.解决方法四: 结果显示: Qt5+MSVC编译 中文字符显示乱码. ...

  4. QT学习笔记之对话框

    QT学习笔记之对话框 对话框是一种用户界面(窗口),它的主要功能是输出信息和接收用户的输入.在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互. 1)       模式对话框:用户只能与 ...

  5. QT学习笔记(摘抄)

    QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...

  6. 【QT学习笔记】基于QT的天气预报

    [QT学习笔记]基于QT的天气预报 前言 那就开始吧! 先看一下效果 颜面最重要,画个UI 构造实现 怎么开始? 开始解析数据 关于城市切换 ok 最后源码献上 感谢 前言 学习qt已经有一段时间了, ...

  7. QT 学习笔记(六)

    文章目录 一.设计器的使用 二.常用控件 1. Containers 容器类 2. Input Widgets 输出控件 3. Display Widgets 显示类控件 三.代码和运行结果 1. 主 ...

  8. Qt学习笔记,Qt国际化

    Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\     ...

  9. Qt学习笔记之MySQL数据库

    一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQ ...

最新文章

  1. .如何实现浏览器内多个标签页之间的通信?
  2. websocket 本地可以服务器断开 springboot linux_SpringBoot+WebSocket实现简单的数据推送...
  3. python await原理_JavaScript async/await原理及实例解析
  4. java中多条件与不定条件查询
  5. c#读蓝牙数据_CSharp--BlueTooth 实现蓝牙通讯的程序 C#开发 可以发送和接收数据 方便二次开发 - 下载 - 搜珍网...
  6. cmd执行python 环境变量应该怎么写_python怎么运行py文件?.py文件cmd命令方法及环境变量配置教程...
  7. const 指针_C语言学习日记(11)——const与指针
  8. 毛概社会实践报告3000字
  9. 推理集 —— death
  10. java itext 横线,Java itext生成pdf设置下划线,,package cn.o
  11. CS231n李飞飞计算机视觉 神经网络训练细节part1上
  12. adb与java端口冲突,如何解决adb devices 端口被占用的问题zz
  13. 层次分析法(AHP)原理以及应用
  14. 图的遍历 (深度优先遍历和广度优先遍历)
  15. 高斯消元法求矩阵的逆
  16. 不相交轮换的乘积怎么求_伽罗华理论基础_刘长安.pdf_(12)(123)(14)不相交的乘积,8.将10次置换表互不相交的循环置换的乘积,并且求出。的逆与。的阶-教育文档类资源...
  17. 使用 Notepad 或 TextEdit 来编写 HTML
  18. windows10关闭java自动更新
  19. python抽荣耀水晶_如何快速抽到荣耀水晶?梦泪直播教抽奖,这个规律一抽必中!...
  20. 设置文字样式并写入CAD

热门文章

  1. web developer tips (78):使用文档大纲导航
  2. 有了这个运维方案,让IT信息化人员头疼的系统宕机再也没出现
  3. 新图表来袭,FineReport新增热力地图、漏斗图、图表切换新功能
  4. 【飞秋教程】文字表情图片对话
  5. #ifndef、#def、#endif等宏是什么意思
  6. Visual C++编程中的文件操作
  7. 一条来自 GitHub 重磅消息!
  8. linux打包备份到其他机器,linux系统备份恢复到本机或是别的机器上
  9. 解读文献里的那些图——流式细胞术
  10. JAMA子刊:20来岁就要控制体重!分析超8万中国人数据发现,成年到中年体重每多增加10斤,老了之后死亡风险增加10%...