要绘制一个长方体,每一面都是图片。

为了简便,就不使用EBO了。

前面的内容是绘制一个面的,但是长方体有六个面。其实方法也是一样的,根据这个图设置坐标:

float vertices[] =
{//位置坐标              纹理坐标-0.5f, -0.5f, -0.5f,    0.0f, 0.0f,0.5f, -0.5f, -0.5f,    1.0f, 0.0f,0.5f, 0.5f, -0.5f,     1.0f, 1.0f,0.5f, 0.5f, -0.5f,     1.0f, 1.0f,-0.5f, 0.5f, -0.5f,     0.0f, 1.0f,-0.5f, -0.5f, -0.5f,    0.0f, 0.0f,-0.5f, -0.5f, 0.5f,     0.0f, 0.0f,0.5f, -0.5f, 0.5f,      1.0f, 0.0f,0.5f, 0.5f, 0.5f,       1.0f, 1.0f,0.5f, 0.5f, 0.5f,       1.0f, 1.0f,-0.5f, 0.5f, 0.5f,      0.0f, 1.0f,-0.5f, -0.5f, 0.5f,     0.0f, 0.0f,-0.5f, 0.5f, 0.5f,      1.0f, 0.0f,-0.5f, 0.5f, -0.5f,     1.0f, 1.0f,-0.5f, -0.5f, -0.5f,    0.0f, 1.0f,-0.5f, -0.5f, -0.5f,    0.0f, 1.0f,-0.5f, -0.5f, 0.5f,     0.0f, 0.0f,-0.5f, 0.5f, 0.5f,      1.0f, 0.0f,0.5f, 0.5f, 0.5f,      1.0f, 0.0f,0.5f, 0.5f, -0.5f,     1.0f, 1.0f,0.5f, -0.5f, -0.5f,    0.0f, 1.0f,0.5f, -0.5f, -0.5f,    0.0f, 1.0f,0.5f, -0.5f, 0.5f,     0.0f, 0.0f,0.5f, 0.5f, 0.5f,      1.0f, 0.0f,-0.5f, -0.5f, -0.5f,    0.0f, 1.0f,0.5f, -0.5f, -0.5f,    1.0f, 1.0f,0.5f, -0.5f, 0.5f,     1.0f, 0.0f,0.5f, -0.5f, 0.5f,     1.0f, 0.0f,-0.5f, -0.5f, 0.5f,     0.0f, 0.0f,-0.5f, -0.5f, -0.5f,    0.0f, 1.0f,-0.5f, 0.5f, -0.5f,     0.0f, 1.0f,0.5f, 0.5f, -0.5f,     1.0f, 1.0f,0.5f, 0.5f, 0.5f,      1.0f, 0.0f,0.5f, 0.5f, 0.5f,      1.0f, 0.0f,-0.5f, 0.5f, 0.5f,      0.0f, 0.0f,-0.5f, 0.5f, -0.5f,     0.0f, 1.0f
};
//顶点着色器
#version 450 core
layout(location = 0) in vec3 aPos;
layout(location = 1) in vec2 aTexCord;
out vec2 TexCord;
void main(){gl_Position = vec4(aPos, 1.0f);TexCord=aTexCord;
}
//片段着色器
#version 450 core
out vec4 FragColor;
in vec2 TexCord;
uniform sampler2D textureWall;
void main()
{FragColor = texture(textureWall,TexCord);
}
#include "widget.h"
#include <QOpenGLShaderProgram>
#include <QTimer>
#include <QTime>
#include <QOpenGLTexture>unsigned int VBO, VAO;Widget::Widget(QWidget *parent) : QOpenGLWidget(parent)
{
}Widget::~Widget()
{makeCurrent();glDeleteBuffers(1,&VBO);glDeleteVertexArrays(1,&VAO);doneCurrent();
}void Widget::initializeGL()
{initializeOpenGLFunctions();glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), nullptr);glEnableVertexAttribArray(0);glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));glEnableVertexAttribArray(1);glBindBuffer(GL_ARRAY_BUFFER, 0);shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,":/shapes.vert");shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,":/shapes.frag");if(!shaderProgram.link())qDebug()<<"着色器程序编译错误信息:"<<shaderProgram.log();textureWall = new QOpenGLTexture(QImage(":/image/wall.jpg").mirrored());shaderProgram.bind();shaderProgram.setUniformValue("textureWall",0);//纹理单元0glBindVertexArray(0);
}void Widget::paintGL()
{glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);shaderProgram.bind();glBindVertexArray(VAO);textureWall->bind(0);glDrawArrays(GL_TRIANGLES,0,36);
}

结果是这样的:

因为我们是从一个面的中央观察一个立方体,只能看到它的一个面。

要使它看起来有立方体的感觉要进行一些操作。

一些概念

模型矩阵(model)

定义缩放,旋转,平移的操作。

视图矩阵(view)

模拟一个摄像机的镜头,以便可以在3D空间中的某个位置去观察另一个位置。

投影矩阵(projection)

负责使看到的画面符合近大远小的透视规律,并且保证无论窗口的宽高比是多少,看到的画面都不会再变形。

顶点位置乘以这三个矩阵即可得到立体的效果。

//顶点着色器
#version 450 core
layout(location = 0) in vec3 aPos;
layout(location = 1) in vec2 aTexCord;
out vec2 TexCord;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{gl_Position = projection*view*model*vec4(aPos, 1.0f);TexCord = aTexCord;
}
#include "widget.h"
#include <QOpenGLShaderProgram>
#include <QTimer>
#include <QTime>
#include <QOpenGLTexture>unsigned int VBO, VAO;float vertices[] =
{//位置坐标              纹理坐标-0.5f, -0.5f, -0.5f,    0.0f, 0.0f,0.5f, -0.5f, -0.5f,    1.0f, 0.0f,0.5f, 0.5f, -0.5f,     1.0f, 1.0f,0.5f, 0.5f, -0.5f,     1.0f, 1.0f,-0.5f, 0.5f, -0.5f,     0.0f, 1.0f,-0.5f, -0.5f, -0.5f,    0.0f, 0.0f,-0.5f, -0.5f, 0.5f,     0.0f, 0.0f,0.5f, -0.5f, 0.5f,      1.0f, 0.0f,0.5f, 0.5f, 0.5f,       1.0f, 1.0f,0.5f, 0.5f, 0.5f,       1.0f, 1.0f,-0.5f, 0.5f, 0.5f,      0.0f, 1.0f,-0.5f, -0.5f, 0.5f,     0.0f, 0.0f,-0.5f, 0.5f, 0.5f,      1.0f, 0.0f,-0.5f, 0.5f, -0.5f,     1.0f, 1.0f,-0.5f, -0.5f, -0.5f,    0.0f, 1.0f,-0.5f, -0.5f, -0.5f,    0.0f, 1.0f,-0.5f, -0.5f, 0.5f,     0.0f, 0.0f,-0.5f, 0.5f, 0.5f,      1.0f, 0.0f,0.5f, 0.5f, 0.5f,      1.0f, 0.0f,0.5f, 0.5f, -0.5f,     1.0f, 1.0f,0.5f, -0.5f, -0.5f,    0.0f, 1.0f,0.5f, -0.5f, -0.5f,    0.0f, 1.0f,0.5f, -0.5f, 0.5f,     0.0f, 0.0f,0.5f, 0.5f, 0.5f,      1.0f, 0.0f,-0.5f, -0.5f, -0.5f,    0.0f, 1.0f,0.5f, -0.5f, -0.5f,    1.0f, 1.0f,0.5f, -0.5f, 0.5f,     1.0f, 0.0f,0.5f, -0.5f, 0.5f,     1.0f, 0.0f,-0.5f, -0.5f, 0.5f,     0.0f, 0.0f,-0.5f, -0.5f, -0.5f,    0.0f, 1.0f,-0.5f, 0.5f, -0.5f,     0.0f, 1.0f,0.5f, 0.5f, -0.5f,     1.0f, 1.0f,0.5f, 0.5f, 0.5f,      1.0f, 0.0f,0.5f, 0.5f, 0.5f,      1.0f, 0.0f,-0.5f, 0.5f, 0.5f,      0.0f, 0.0f,-0.5f, 0.5f, -0.5f,     0.0f, 1.0f
};QVector<QVector3D> cubePositions =
{QVector3D( 0.0f, 0.0f, 0.0f),//QVector3D( 2.0f, 5.0f, -15.0f),//QVector3D(-1.5f, -2.2f, -2.5f),//QVector3D(-3.8f, -2.0f, -12.3f),//QVector3D( 2.4f, -0.4f, -3.5f),//QVector3D(-1.7f, 3.0f, -7.5f),//QVector3D( 1.3f, -2.0f, -2.5f),//QVector3D( 1.5f, 2.0f, -2.5f),//QVector3D( 1.5f, 0.2f, -1.5f),//QVector3D(-1.3f, 1.0f, -1.5f)
};Widget::Widget(QWidget *parent) : QOpenGLWidget(parent)
{
}Widget::~Widget()
{makeCurrent();glDeleteBuffers(1,&VBO);glDeleteVertexArrays(1,&VAO);doneCurrent();
}void Widget::initializeGL()
{initializeOpenGLFunctions();glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), nullptr);glEnableVertexAttribArray(0);glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));glEnableVertexAttribArray(1);glBindBuffer(GL_ARRAY_BUFFER, 0);shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,":/shapes.vert");shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,":/shapes.frag");if(!shaderProgram.link())qDebug()<<"着色器程序编译错误信息:"<<shaderProgram.log();textureWall = new QOpenGLTexture(QImage(":/image/wall.jpg").mirrored());shaderProgram.bind();shaderProgram.setUniformValue("textureWall",0);//纹理单元0glBindVertexArray(0);//投影矩阵QMatrix4x4 projection;projection.perspective(60,  //画面视野的角度 人眼在头部不动的情况下,视野大概为60°(float)width()/height(), //窗口比例0.1,100);//参数三和四表示距离摄像机多近个多远范围内的物体要被显示。超出这个范围的物体将无法被显示。shaderProgram.setUniformValue("projection", projection);
}void Widget::paintGL()
{uint time = QTime::currentTime().msec();glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);shaderProgram.bind();//视图矩阵QMatrix4x4 view;view.setToIdentity();//对矩阵进行单位化,保证所有矩阵运算都会在一个单位矩阵上进行view.lookAt(QVector3D(2, 2, 2),     //眼睛的位置QVector3D(0, 0, 0),     //眼睛看的位置QVector3D(0, 1, 0));    //此参数表示方向,相对于眼睛向上的方向。shaderProgram.setUniformValue("view", view);glBindVertexArray(VAO);textureWall->bind(0);for (const QVector3D & item : cubePositions){//模型矩阵QMatrix4x4 model;model.setToIdentity();model.translate(item);//平移model.rotate(time, 1.0f, 1.0f, 0.5f);//旋转 该矩阵将坐标绕矢量 (x, y, z) 旋转angle度model.scale(1.0f);//缩放shaderProgram.setUniformValue("model", model);glDrawArrays(GL_TRIANGLES,0,36);}
}

加上一个定时器:

    auto timer = new QTimer(this);connect(timer,&QTimer::timeout,this,[this]{update();});timer->start(100);

绘制多个:

QVector<QVector3D> cubePositions =
{QVector3D( 0.0f, 0.0f, 0.0f),QVector3D( 2.0f, 5.0f, -15.0f),QVector3D(-1.5f, -2.2f, -2.5f),QVector3D(-3.8f, -2.0f, -12.3f),QVector3D( 2.4f, -0.4f, -3.5f),QVector3D(-1.7f, 3.0f, -7.5f),QVector3D( 1.3f, -2.0f, -2.5f),QVector3D( 1.5f, 2.0f, -2.5f),QVector3D( 1.5f, 0.2f, -1.5f),QVector3D(-1.3f, 1.0f, -1.5f)
};

《Qt-OpenGL系列编程》课程学习记录(8):绘制一个长方体相关推荐

  1. 编程课程学习_如果您想学习数据科学,请从以下编程课程之一开始

    编程课程学习 by David Venturi 大卫·文图里(David Venturi) 如果您想学习数据科学,请从以下编程课程之一开始 (If you want to learn Data Sci ...

  2. python是什么语言开发的-少儿编程有什么好处?儿童编程课程学习Python的4大原因...

    儿童编程Python是什么课程? Python是强制用一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public Li ...

  3. python 人工智能课程对孩子的好处_少儿编程有什么好处?儿童编程课程学习Python的4大原因...

    儿童编程Python是什么课程? Python是强制用一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public Li ...

  4. 1 Robotics: Aerial Robotics 第3+4周 课程学习记录及课后习题解答

    Robotics: Aerial Robotics 第3+4周 WEEK - 3 Quiz Programming Assignment: 2-D Quadrotor Control WEEK - 4 ...

  5. Windows编程课程学习笔记

    一. Windows程序内部运行机制--Windows编程课程学习笔记 二. MFC框架程序分析--Windows编程课程学习笔记 三. 简单绘图--Windows编程课程学习笔记 四. 文本编程-- ...

  6. [Python学习]PycURL简单学习 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …...

    [Python学习]PycURL简单学习 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source - [Python学习] ...

  7. python做实时温度曲线图_Python学习记录 - matplotlib绘制温度变化折线图

    Python学习记录 - matplotlib绘制温度变化折线图 Python学习记录 - matplotlib绘制温度变化折线图 题目:列表a表示10点到12点每一分钟的气温,累计为2个小时,绘制折 ...

  8. 《Qt-OpenGL系列编程》课程学习记录(1):相关概念、VAO、VBO、绘制三角形、使用OpenGL原生方式编译链接着色器程序

    大家可以去B站看课程的视频支持一下作者哈: OpenGL,Qt实现:1入门篇(已更完)_哔哩哔哩_bilibili课程相关源码.PPT.安装包,完整课程合集(1:入门篇:2:基础光照:3:模型加载:4 ...

  9. Qt VTK软件开发问题学习记录

    1. 0x00000000000000处有未经处理的异样 程序运行时出现下面问题肯定是内存错误,但到底是数组越界(数组边界溢出),指针错误,链接库问题......就需要进一步调试(debug). 链接 ...

  10. Unity3D学习笔记1——绘制一个三角形

    文章目录 1. 绪论 2. 概述 3. 详论 3.1. 准备 3.2. 实现 3.3. 解析 3.3.1. 场景树对象 3.3.2. 绘制方法 4. 结果 1. 绪论 最近想学习一下Unity3d,无 ...

最新文章

  1. Android 高清加载巨图方案 拒绝压缩图片
  2. 百度地图经常崩溃的问题
  3. 提升淘宝排名的27个因素
  4. 装修行业难互联网化?利润不合理并非本质,体制才是
  5. write up: web 前女友(SKCTF)
  6. javaweb如何定位
  7. 这6种性格的人不适合做数据分析
  8. linux服务器开发板,linuxnfs服务器的建立,虚拟机、开发板间的通信
  9. JAVA中文件指针复位到文件开头
  10. 设计每个网站时所追求的5个目标
  11. 详解MAC硬盘中各个文件夹
  12. BMP文件格式详解(BMP file format) (转)
  13. graphpad做单因素方差分析_如何使用Graphpad做单因素方差分析
  14. Logstash mutate 插件
  15. 中国10大PCBA加工厂商排名
  16. 小米手机4c获取Root权限的流程
  17. Activiti7 工作流引擎入门
  18. sql注入漏洞检测攻略
  19. true在python是什么意思_Python3中真真假假True、False、None等含义是什么
  20. 【国产虚拟仪器】基于Zynq的雷达10Gbps高速PCIE数据采集卡方案(二)硬件设计

热门文章

  1. 三星 i8268 android6,三星I8268怎么样?
  2. python量化交易策略实例_用 Python 实现你的量化交易策略
  3. Inskeep – 一个优秀的Instagram图片保存工具
  4. Bystack世界观(一):资产的三个维度
  5. 深度学习的性能评价指标---图像分类的评价指标
  6. appearance: none;的使用
  7. PhpStorm添加PHP代码规范检查CodeSniffer(phpcs)和PHP代码静态分析工具Mess Detector(phpmd)
  8. 基于Java的新闻发布系统
  9. excel vba 把内容放到剪贴板,以及把剪贴板的内容粘贴到表格中
  10. Agv、Rgv 车辆控制调度系统开发第四篇