当前位置:网站首页>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
边栏推荐
猜你喜欢
Brute force recursion to dynamic programming 07 (516. Longest palindrome subsequence)
The Sandbox 市场平台将上线 Isla Obscura 第五期 NFT 作品集
一个循环,两个循环问题的思考及复现
lombok 下的@Builder和@EqualsAndHashCode(callSuper = true)注解
梅科尔工作室-14天华为培训三
数据中台建设(八):数据服务体系建设
.NET深入解析LINQ框架(四:IQueryable、IQueryProvider接口详解)
Day017 封装
暴力递归到动态规划 07(516. 最长回文子序列)
新库上线 | CnOpenDataA股上市公司董监高信息数据
随机推荐
提高测试覆盖率的四大步骤
全栈---JSONP
易购数码类电商商城网页设计与实现项目源码
【Gopher 学个函数】边学边练,简单为 Go 上个分
暴力递归到动态规划 08(小马走象棋)
在表格数据上,为什么基于树的模型仍然优于深度学习?
initramfs详解----设备文件系统
7-Redis工具类
优秀的 Verilog/FPGA开源项目总结及交流群
mysql binlog日期解析成yyyy-MM-dd
DTD约束和Schema约束
嵌入式开发:嵌入式基础——’ ’和” ”的区别
10. SAP ABAP OData 服务如何支持修改(Update)操作
微信小程序--》条件与列表渲染以及WXSS模板样式
Brute force recursion to dynamic programming 07 (516. Longest palindrome subsequence)
OpenWRT setup ipv6 network
鲲鹏devkit开发套件
开发JSP应用的基础知识
项目管理到底管的是什么?
Wireshark data capture and analysis of the transport layer protocol (TCP protocol)