当前位置:网站首页>qt opengl 使用不同的颜色绘制线框三角形
qt opengl 使用不同的颜色绘制线框三角形
2022-08-03 01:26:00 【wb175208】
先看效果:
#pragma once
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
class MyOpenGLWgt : public QOpenGLWidget,public QOpenGLFunctions_3_3_Core {
Q_OBJECT
public:
MyOpenGLWgt(QWidget *parent = Q_NULLPTR);
~MyOpenGLWgt();
private:
void initializeGL()override;
void resizeGL(int w, int h)override;
void paintGL()override;
private:
GLuint VBOs[2], VAOs[2];
QOpenGLShaderProgram _shaderProgram;//着色器程序,管理系统所有的着色器
QOpenGLShaderProgram _shaderProgram2;//着色器程序,管理系统所有的着色器
};
#include "MyOpenGLWgt.h"
MyOpenGLWgt::MyOpenGLWgt(QWidget *parent) :QOpenGLWidget(parent) {
}
MyOpenGLWgt::~MyOpenGLWgt() {
glDeleteBuffers(2, VBOs);
glDeleteVertexArrays(2, VAOs);
}
void MyOpenGLWgt::initializeGL() {
initializeOpenGLFunctions();
GLfloat firstTriangle[] = {
-0.9f, -0.5f, 0.0f,
-0.0f, -0.5f, 0.0f,
-0.45f, 0.5f, 0.0f
};
GLfloat secondTriangle[] = {
0.0f, -0.5f, 0.0f,
0.9f, -0.5f, 0.0f,
0.45f, 0.5f, 0.0f
};
//一次创建多个对象
glGenVertexArrays(2, VAOs);
glGenBuffers(2, VBOs);
//第一个三角形
glBindVertexArray(VAOs[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(firstTriangle), firstTriangle, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void*)0);
glEnableVertexAttribArray(0);//VAOs[0]的第一个属性
glBindVertexArray(0);
glBindBuffer(VBOs[0], 0);
//第二个三角形
glBindVertexArray(VAOs[1]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(secondTriangle), secondTriangle, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void*)0);
glEnableVertexAttribArray(0);//VAOs[1]的第一个属性
glBindVertexArray(0);
glBindBuffer(VBOs[1], 0);
//绑定Shader
QOpenGLShader vertexShager(QOpenGLShader::Vertex);//顶点着色器
vertexShager.compileSourceFile("E:/Projects/QtGuiTest/OPenGLApp/TwoTriangle/FirstTriangle.vert");
QOpenGLShader fragmentShager(QOpenGLShader::Fragment);//片段着色器
fragmentShager.compileSourceFile("E:/Projects/QtGuiTest/OPenGLApp/TwoTriangle/FirstTriangle.frag");
_shaderProgram.addShader(&vertexShager);
_shaderProgram.addShader(&fragmentShager);
_shaderProgram.link();
//第二个shader程序
QOpenGLShader vertexShager2(QOpenGLShader::Vertex);//顶点着色器
vertexShager2.compileSourceFile("E:/Projects/QtGuiTest/OPenGLApp/TwoTriangle/FirstTriangle.vert");
QOpenGLShader fragmentShager2(QOpenGLShader::Fragment);//片段着色器
fragmentShager2.compileSourceFile("E:/Projects/QtGuiTest/OPenGLApp/TwoTriangle/SecondTriangle.frag");
_shaderProgram2.addShader(&vertexShager2);
_shaderProgram2.addShader(&fragmentShager2);
_shaderProgram2.link();
//设置成线框模式
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}
void MyOpenGLWgt::resizeGL(int w, int h) {
}
void MyOpenGLWgt::paintGL() {
glClearColor(0.4f, 0.4f, 0.4f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
_shaderProgram.bind();
glBindVertexArray(VAOs[0]);
glDrawArrays(GL_TRIANGLES, 0, 3);
_shaderProgram2.bind();
glBindVertexArray(VAOs[1]);
glDrawArrays(GL_TRIANGLES, 0, 3);
update();
}
顶点着色器:
#version 330 core
layout (location = 0) in vec3 aPos;
void main(){
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
第一个片段着色器:
#version 330 core
out vec4 fragColor;
void main(){
fragColor = vec4(0.0f, 0.0f, 1.0f, 1.0f);
}
第二个片段着色器:
#version 330 core
out vec4 fragColor;
void main(){
fragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
aaa
边栏推荐
猜你喜欢
MATLAB绘制填充图(X轴上下两种颜色)
暴力递归到动态规划 07(516. 最长回文子序列)
Latex-查看预收录在arXiv.org上论文的TeX源文件
VS Code 这么牛,再次印证了一句名言
torchvision.datasets.ImageFolder使用详解
大厂标配 | 百亿级并发系统设计 | 学完薪资框框涨
2022-08-02:小红拿到了一个大立方体,该大立方体由1*1*1的小方块拼成,初始每个小方块都是白色。 小红可以每次选择一个小方块染成红色, 每次小红可能选择同一个小方块重复染色, 每次染色以后,
华为防火墙双机热备技术:HRP、VGMP、VRRP,三大技术值得一学!
嵌入式开发:嵌入式基础——’ ’和” ”的区别
优秀的 Verilog/FPGA开源项目总结及交流群
随机推荐
[NCTF2019]SQLi-1||SQL Injection
PHICOMM(斐讯)N1盒子 - recovery模式救砖卡登录页LOGO卡1%卡4%卡26%
投资的思考
Linear DP
为什么要使用 playwright 做浏览器自动化测试?
MATLAB绘制填充图(X轴上下两种颜色)
236. The binary tree in recent common ancestor
南瓜科学新品上线 开辟益智玩具新世界
Day017 封装
v-if、v-else、v-elseif v-show v-for
常用工具链和虚拟环境-msys2与mingw
怎么做postgrsql主备?
PHICOMM(斐讯)N1盒子 - Armbian5.77(Debian 9)基本配置
面试题整理1
SAP ABAP Gateway Client 里 OData 测试的 PUT, PATCH, MERGE 请求有什么区别
apache-activemq-5.14.1
【深度学习】基于tensorflow的小型物体识别训练(数据集:CIFAR-10)
国标GB28181协议EasyGBS平台项目现场通知消息过多导致系统卡顿该如何解决?
全栈---JSONP
HCIP第十二天_二层MPLS实验