Qt学习笔记-OpenGL做正方体并旋转
运行截图如下图:
代码如下:
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做正方体并旋转相关推荐
- Qt学习笔记,Qt程序架构设计要旨
Qt学习笔记,Qt程序架构设计要旨 时间过得很快,转眼学习Qt已经有一个多月了,对Qt的学习也在不断的深入中.自己手下的code也很多了,不过不得不说,还有很多的部分没有接触过,比如网络编程,2D,3 ...
- Qt学习笔记之数据库
一.数据库简介 1.1.数据和数据库(DB) 用计算机进行数据处理,首先就要把信息以数据形式存储到计算机中,故数据是可以被计算机接受和处理的符号.根据所表示的信息特征不同,数据有不同的类别,如数字.文 ...
- QT学习笔记(四):Qt5+MSVC编译 中文字符显示乱码问题解决
QT学习笔记(四):Qt5+MSVC编译 中文字符显示乱码问题解决 问题: 1.解决方法一: 2.解决方法二: 3.解决方法三: 4.解决方法四: 结果显示: Qt5+MSVC编译 中文字符显示乱码. ...
- QT学习笔记之对话框
QT学习笔记之对话框 对话框是一种用户界面(窗口),它的主要功能是输出信息和接收用户的输入.在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互. 1) 模式对话框:用户只能与 ...
- QT学习笔记(摘抄)
QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...
- 【QT学习笔记】基于QT的天气预报
[QT学习笔记]基于QT的天气预报 前言 那就开始吧! 先看一下效果 颜面最重要,画个UI 构造实现 怎么开始? 开始解析数据 关于城市切换 ok 最后源码献上 感谢 前言 学习qt已经有一段时间了, ...
- QT 学习笔记(六)
文章目录 一.设计器的使用 二.常用控件 1. Containers 容器类 2. Input Widgets 输出控件 3. Display Widgets 显示类控件 三.代码和运行结果 1. 主 ...
- Qt学习笔记,Qt国际化
Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\ ...
- Qt学习笔记之MySQL数据库
一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQ ...
最新文章
- .如何实现浏览器内多个标签页之间的通信?
- websocket 本地可以服务器断开 springboot linux_SpringBoot+WebSocket实现简单的数据推送...
- python await原理_JavaScript async/await原理及实例解析
- java中多条件与不定条件查询
- c#读蓝牙数据_CSharp--BlueTooth 实现蓝牙通讯的程序 C#开发 可以发送和接收数据 方便二次开发 - 下载 - 搜珍网...
- cmd执行python 环境变量应该怎么写_python怎么运行py文件?.py文件cmd命令方法及环境变量配置教程...
- const 指针_C语言学习日记(11)——const与指针
- 毛概社会实践报告3000字
- 推理集 —— death
- java itext 横线,Java itext生成pdf设置下划线,,package cn.o
- CS231n李飞飞计算机视觉 神经网络训练细节part1上
- adb与java端口冲突,如何解决adb devices 端口被占用的问题zz
- 层次分析法(AHP)原理以及应用
- 图的遍历 (深度优先遍历和广度优先遍历)
- 高斯消元法求矩阵的逆
- 不相交轮换的乘积怎么求_伽罗华理论基础_刘长安.pdf_(12)(123)(14)不相交的乘积,8.将10次置换表互不相交的循环置换的乘积,并且求出。的逆与。的阶-教育文档类资源...
- 使用 Notepad 或 TextEdit 来编写 HTML
- windows10关闭java自动更新
- python抽荣耀水晶_如何快速抽到荣耀水晶?梦泪直播教抽奖,这个规律一抽必中!...
- 设置文字样式并写入CAD
热门文章
- web developer tips (78):使用文档大纲导航
- 有了这个运维方案,让IT信息化人员头疼的系统宕机再也没出现
- 新图表来袭,FineReport新增热力地图、漏斗图、图表切换新功能
- 【飞秋教程】文字表情图片对话
- #ifndef、#def、#endif等宏是什么意思
- Visual C++编程中的文件操作
- 一条来自 GitHub 重磅消息!
- linux打包备份到其他机器,linux系统备份恢复到本机或是别的机器上
- 解读文献里的那些图——流式细胞术
- JAMA子刊:20来岁就要控制体重!分析超8万中国人数据发现,成年到中年体重每多增加10斤,老了之后死亡风险增加10%...