Qt5与现代OpenGL学习(四)X轴方向旋转60度

请添加图片描述

在这里插入图片描述
在这里插入图片描述
把上面两张图像放到D盘1文件夹内:
shader.h

#ifndef SHADER_H
#define SHADER_H#include <QDebug>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
#include <QString>class Shader {
public:Shader(const QString& vertexSourcePath, const QString& fragmentSourcePath);~Shader();QOpenGLShaderProgram *shaderProgram;void use(){shaderProgram->bind();}//还是把设置着色器uniform变量操作写成Shader里的inline成员函数管理,真的方便很多。void setMat4(const QString& name, const QMatrix4x4& value){GLuint loc = shaderProgram->uniformLocation(name);shaderProgram->setUniformValue(loc, value);}void setInt(const QString& name, const GLint& value){GLuint loc = shaderProgram->uniformLocation(name);shaderProgram->setUniformValue(loc, value);}
};#endif // SHADER_H

shader.cpp

#include "shader.h"Shader::Shader(const QString& vertexPath, const QString& fragmentPath){QOpenGLShader vertexShader(QOpenGLShader::Vertex);bool success = vertexShader.compileSourceFile(vertexPath);if(!success){qDebug() << "ERROR::SHADER::VERTEX::COMPILATION_FAILED" << endl;qDebug() << vertexShader.log() << endl;}QOpenGLShader fragmentShader(QOpenGLShader::Fragment);success  =fragmentShader.compileSourceFile(fragmentPath);if(!success){qDebug() << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED" << endl;qDebug() << fragmentShader.log() << endl;}shaderProgram = new QOpenGLShaderProgram();shaderProgram->addShader(&vertexShader);shaderProgram->addShader(&fragmentShader);success = shaderProgram->link();if(!success){qDebug() << "ERROR::SHADER::PROGRAM::LINKING_FAILED" << endl;qDebug() << shaderProgram->log() << endl;}
}Shader::~Shader(){delete shaderProgram;
}

triangle.h

#ifndef WIDGET_H
#define WIDGET_H#include <QOpenGLWidget>
#include <QDebug>
#include <QOpenGLFunctions_3_3_Core>
#include "shader.h"
#include <QOpenGLTexture>
#include <QTime>    //增添头文件#include <QOpenGLFunctions>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>class Triangle : public QOpenGLWidget,protected QOpenGLFunctions
{Q_OBJECTpublic:Triangle(QWidget* parent=0);GLuint a;~Triangle();
protected:virtual void initializeGL();virtual void resizeGL(int w, int h);virtual void paintGL();
private:Shader *ourShader;QOpenGLTexture *texture1;QOpenGLTexture *texture2;QOpenGLFunctions_3_3_Core *core;QTime time; //增添QTime对象,替代glfwGetTime()函数
};#endif // WIDGET_H

triangle.cpp

#include "triangle.h"
GLuint VBO, VAO, EBO;Triangle::Triangle(QWidget* parent):QOpenGLWidget(parent)
{this->setWindowTitle("Coordinate System");
}Triangle::~Triangle(){delete ourShader;core->glDeleteVertexArrays(1, &VAO);core->glDeleteBuffers(1, &VBO);core->glDeleteBuffers(1, &EBO);texture1->destroy();texture2->destroy();
}void Triangle::initializeGL(){//着色器部分core = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>();ourShader = new Shader(":/shaders/vertexshadersource.vert", ":/shaders/fragmentshadersource.frag");//VAO,VBO数据部分GLfloat vertices[] = {0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f, // top right0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f, // bottom right-0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f, // bottom left-0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f  // top left};GLuint indices[] = {0, 1, 3, // first triangle1, 2, 3  // second triangle};core->glGenVertexArrays(1, &VAO);//两个参数,第一个为需要创建的缓存数量。第二个为用于存储单一ID或多个ID的GLuint变量或数组的地址core->glGenBuffers(1, &VBO);core->glGenBuffers(1, &EBO);core->glBindVertexArray(VAO);core->glBindBuffer(GL_ARRAY_BUFFER, VBO);core->glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);core->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);core->glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);core->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);core->glEnableVertexAttribArray(0);// color attributecore->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));core->glEnableVertexAttribArray(1);// texture coord attributecore->glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));core->glEnableVertexAttribArray(2);//纹理//第一张箱子texture1 = new QOpenGLTexture(QImage("D:/1/1.png").mirrored(), QOpenGLTexture::GenerateMipMaps); //直接生成绑定一个2d纹理, 并生成多级纹理MipMapsif(!texture1->isCreated()){qDebug() << "Failed to load texture" << endl;}texture1->setWrapMode(QOpenGLTexture::DirectionS, QOpenGLTexture::Repeat);// 等于glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);texture1->setWrapMode(QOpenGLTexture::DirectionT, QOpenGLTexture::Repeat);//    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);texture1->setMinificationFilter(QOpenGLTexture::Linear);   //等价于glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);texture1->setMagnificationFilter(QOpenGLTexture::Linear);  //     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//第二张笑脸texture2 = new QOpenGLTexture(QImage("D:/1/10.png").mirrored(), QOpenGLTexture::GenerateMipMaps); //直接生成绑定一个2d纹理, 并生成多级纹理MipMapsif(!texture2->isCreated()){qDebug() << "Failed to load texture" << endl;}texture2->setWrapMode(QOpenGLTexture::DirectionS, QOpenGLTexture::Repeat);// 等于glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);texture2->setWrapMode(QOpenGLTexture::DirectionT, QOpenGLTexture::Repeat);//    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);texture2->setMinificationFilter(QOpenGLTexture::Linear);   //等价于glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);texture2->setMagnificationFilter(QOpenGLTexture::Linear);  //     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//设置纹理单元编号ourShader->use();ourShader->shaderProgram->setUniformValue(ourShader->shaderProgram->uniformLocation("texture1"), 0);//等价于ourShader.setInt("texture1", 0) setInt函数,是Vries自写的函数,实际应用还是要先获取“texture1”的location,然后设值ourShader->shaderProgram->setUniformValue(ourShader->shaderProgram->uniformLocation("texture2"), 1);core->glClearColor(0.5f, 0.3f, 0.5f, 1.0f);//开启计时器,返回毫秒//time.start();QMatrix4x4 model, projection, view;model.rotate(-60.0f, QVector3D(1.0f, 0.0f, 0.0f));view.translate(QVector3D(0.0f, 0.0f, -3.0f));projection.perspective(45.0f, (GLfloat)width()/(GLfloat)height(), 0.1f, 100.0f);ourShader->use();ourShader->setMat4("model", model);ourShader->setMat4("view", view);ourShader->setMat4("projection", projection);
}void Triangle::resizeGL(int w, int h){core->glViewport(0, 0, w, h);
}void Triangle::paintGL(){core->glClear(GL_COLOR_BUFFER_BIT);core->glActiveTexture(GL_TEXTURE0);texture1->bind();core->glActiveTexture(GL_TEXTURE1);texture2->bind();ourShader->use();core->glBindVertexArray(VAO);core->glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);update();
}

fragmentshadersource.frag

#version 330 core
out vec4 FragColor;in vec3 ourColor;
in vec2 TexCoord;uniform sampler2D texture1;
uniform sampler2D texture2;void main()
{FragColor = mix(texture2D(texture1, TexCoord), texture2D(texture2, TexCoord), 0.2f);
}

vertexshadersource.vert

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;out vec3 ourColor;
out vec2 TexCoord;uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;void main(){gl_Position = projection * view * model * vec4(aPos, 1.0f);ourColor = aColor;TexCoord = aTexCoord;
}

在mainwindow.ui中,添加QWidget,并提升为:Triangle

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Machine Learning Q and AI 读书笔记】- 02 自监督学习

Machine Learning Q and AI 中文译名 大模型技术30讲&#xff0c;主要总结了大模型相关的技术要点&#xff0c;结合学术和工程化&#xff0c;对LLM从业者来说&#xff0c;是一份非常好的学习实践技术地图. 本文是Machine Learning Q and AI 读书笔记的第2篇&#xff0c;对应原…

using var connection = connectionFactory.CreateConnection(); using var 是什么意思

在 .NET 中&#xff0c;​​垃圾回收&#xff08;Garbage Collection, GC&#xff09;​​ 确实是自动管理内存的机制&#xff0c;但它 ​​仅适用于托管资源&#xff08;Managed Resources&#xff09;​​&#xff08;如类实例、数组等&#xff09;。然而&#xff0c;对于 ​…

Multicore-TSNE

文章目录 TSNE使用scikit-learn库使用Multicore-TSNE库安装方法基本使用方法采用不同的距离度量 其他资料 TSNE t-Distributed Stochastic Neighbor Embedding (t-SNE) 是一种高维数据的降维方法&#xff0c;由Laurens van der Maaten和Geoffrey Hinton于2008年提出&#xff0…

SI5338-EVB Usage Guide(LVPECL、LVDS、HCSL、CMOS、SSTL、HSTL)

目录 1. 简介 1.1 EVB 介绍 1.2 Si5338 Block Diagram 2. EVB 详解 2.1 实物图 2.2 基本配置 2.2.1 Universal Pin 2.2.2 IIC I/F 2.2.3 Input Clocks 2.2.4 Output Frequencies 2.2.5 Output Driver 2.2.6 Freq and Phase Offset 2.2.7 Spread Spectrum 2.2.8 快…

Spring AI应用系列——基于OpenTelemetry实现大模型调用的可观测性实践

一、项目背景与目标 在AI应用日益复杂的今天&#xff0c;大模型服务&#xff08;如语言理解和生成&#xff09;的性能监控和问题排查变得尤为关键。为了实现对大模型调用链路的可观测性&#xff08;Observability&#xff09;管理&#xff0c;我们基于 Spring Boot Spring AI…

Spyglass:官方Hands-on Training(一)

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 本文是对Spyglass Hands-on Training中第一个实验的翻译&#xff08;有删改&#xff09;&#xff0c;Lab文件可以从以下链接获取。Spyglass Hands-on Traininghttps:…

PCB设计工艺规范(三)走线要求

走线要求 1.走线要求2.固定孔、安装孔、过孔要求3.基准点要求4.丝印要求 1.走线要求 印制板距板边距离:V-CUT 边大于 0.75mm&#xff0c;铣槽边大于0.3mm。为了保证 PCB 加工时不出现露铜的缺陷&#xff0c;要求所有的走线及铜箔距离板边:V-CUT边大于 0.75mm&#xff0c;铣槽边…

抓取工具Charles配置教程(mac电脑+ios手机)

mac电脑上的配置 1. 下载最新版本的Charles 2. 按照以下截图进行配置 2.1 端口号配置&#xff1a; 2.2 https配置 3. mac端证书配置 4. IOS手机端网络配置 4.1 先查看电脑上的配置 4.2 配置手机网络 连接和电脑同一个wifi&#xff0c;然后按照以下截图进行配置 5. 手机端证书…

【CSS】精通Flex布局(全)

目录 1. flex布局体验 1.1 传统布局 与 flex布局 1.2 初体验 2. flex布局原理 2.1 布局原理 3. flex布局父项常见属性 3.1 常见父项属性 3.2 属性值 3.3 justify-content 设置主轴上的子元素排列方式 3.4 flex-wrap设置子元素是否换行 3.5 align-items 设置侧轴上的…

力扣第447场周赛

这次终于赶上力扣的周赛了, 赛时成绩如下(依旧还是三题 )&#xff1a; 1. 统计被覆盖的建筑 给你一个正整数 n&#xff0c;表示一个 n x n 的城市&#xff0c;同时给定一个二维数组 buildings&#xff0c;其中 buildings[i] [x, y] 表示位于坐标 [x, y] 的一个 唯一 建筑。 如…

AI中常用概念的理解

1. RAG&#xff08;检索增强生成&#xff09; 通俗理解&#xff1a;就像你写作业时&#xff0c;先查课本 / 百度找资料&#xff0c;再根据资料写答案&#xff0c;而不是纯靠记忆瞎编。 AI 模型&#xff08;比如 ChatGPT&#xff09;回答问题时&#xff0c;先去 “数据库 / 互联…

SQLServer多版本兼容Java方案和数据采集

Maven引入 <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>sqljdbc4</artifactId><version>4.0</version></dependency><dependency><groupId>net.sourceforge.jtds</groupId><ar…

【每日八股】复习 Redis Day4:线程模型

文章目录 复习 Redis Day4&#xff1a;线程模型介绍一下 Redis 的线程模型核心线程模型&#xff08;Redis 6.0 之前&#xff09;Redis 6.0 的多线程改进Redis 真的是单线程吗&#xff1f;Redis 的线程模型剖析 上一篇 Redis 的应用我今天才完成&#xff0c;因此明天一并复习 Re…

树莓派智能摄像头实战指南:基于TensorFlow Lite的端到端AI部署

引言&#xff1a;嵌入式AI的革新力量 在物联网与人工智能深度融合的今天&#xff0c;树莓派这一信用卡大小的计算机正在成为边缘计算的核心载体。本文将手把手教你打造一款基于TensorFlow Lite的低功耗智能监控设备&#xff0c;通过MobileNetV2模型实现实时物体检测&#xff0…

vs2019编译occ7.9.0时,出现fatal error C1060: compiler is out of heap space

问题描述 visual studio 2019编译opencascade 7.9.0时&#xff0c;出现编译错误 fatal error C1060: compiler is out of heap space 解决方案 修改vs2019并行编译的线程个数&#xff0c;默认是12个&#xff0c;我改成了4个&#xff0c;问题解决 Tools > Project and Sol…

vue跨域问题总结笔记

目录 一、Websocket跨域问题 1.nginx配置 2.VUE CLI代理 3.env.development配置 4.nginx日志 5.解决 一、解决跨域的几种常用方法 1.Vue CLI代理 2.JSONP 3.WebSocket 4.NGINX解决跨域问题 6.Java解决跨域 二、Vue跨域问题详解 1. 什么是跨域 2. 跨域的例子 3.…

数据结构篇:线性表的另一表达—链表之单链表(下篇)

目录 1.前言 2.是否使用二级指针 3.插入/删除 3.1 pos位置前/后插入 3.2 查找函数 3.3 pos位置删除 3.4 pos位置后面删除 3.5 函数的销毁 4.断言问题 4.1 断言pphead 4.2 断言*pphead 5.三个文件的代码 5.1 头文件 5.2 具体函数实现 5.3 测试用例 1.前言 之前是讲…

完美解决react-native文件直传阿里云oss问题一

前言 通常情况下&#xff0c;作为前后端分离的项目来说&#xff0c;文件上传是最寻常的功能之一。虽然每个公司选择的文件管理云库各不相同&#xff0c;但实现思路基本一致。我所在公司使用阿里云oss文件管理&#xff0c;之前服务端做了透传&#xff0c;但是由于每个测试环境的…

5.运输层

5. 运输层 1. 概述 第2~4章依次介绍了计算机网络体系结构中的物理层、数据链路层和网络层&#xff0c;它们共同解决了将主机通过异构网络互联起来所面临的问题&#xff0c;实现了主机到主机的通信然而在计算机网络中实际进行通信的真正实体&#xff0c;是位于通信两端主机中的…

告别手动时代!物联网软件开发让万物自动互联

清晨&#xff0c;智能窗帘随着阳光自动拉开&#xff1b;运动时&#xff0c;手表精准记录着健康数据&#xff1b;回到家&#xff0c;室温早已调节至最舒适状态...这些场景的实现&#xff0c;都离不开物联网软件开发的技术支撑。在智能家居软件开发、智能穿戴软件开发、医疗器械软…