当前位置:网站首页>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
边栏推荐
- 44LVS负载均衡群集-NAT
- 向往的生活
- 南瓜科学新品上线 开辟益智玩具新世界
- 不想当Window的Dialog不是一个好Modal,弹窗翻身记...
- 236. The binary tree in recent common ancestor
- Brute force recursion to dynamic programming 07 (516. Longest palindrome subsequence)
- iNFTnews | 元宇宙的潜力:一股推动社会进步的力量
- 高并发基石:多线程、守护线程、线程安全、线程同步、互斥锁,一文扫尽!...
- 【遥控器开发基础教程4】疯壳·开源编队无人机-SPI(OLED)
- Kubernetes:(八)调度约束和故障排查
猜你喜欢
随机推荐
项目管理到底管的是什么?
20、商品微服务-web层实现
怎么做postgrsql主备?
常用工具链和虚拟环境-WSL
暴力递归到动态规划 08(小马走象棋)
mysql binlog日期解析成yyyy-MM-dd
常见钓鱼手法及防范
[NCTF2019]SQLi-1||SQL Injection
作业8.2 线程同步互斥机制——互斥锁
UVM中SVA使用指南
EasyGBS播放器优化:设备通道视频播放出现跳屏问题的修复
Day017 封装
扩展卡尔曼滤波【转】
阿南的对话
MATLAB绘制填充图(X轴上下两种颜色)
DTD约束和Schema约束
v-if、v-else、v-elseif v-show v-for
JSP第一篇 -----JSP九大内置对象(隐式对象)和四大域对象
30岁测试开发年薪不足80万,还要被面试官diss混得太差?
Wireshark data capture and analysis of the transport layer protocol (TCP protocol)









