当前位置:网站首页>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
边栏推荐
猜你喜欢

Violence recursion to dynamic programming 08 (pony go chess)

The Multiversity 的 “非常重要的生命体” NFT 推出

什么情况下DigiCert证书会引起发生安全警报?

【面经】被虐了之后,我翻烂了equals源码,总结如下

从 npm 切换到 pnpm,真香!

不想当Window的Dialog不是一个好Modal,弹窗翻身记...

236. The binary tree in recent common ancestor

XSS攻击

【Swoole系列3.3】单进程管理Process

优秀的 Verilog/FPGA开源项目总结及交流群
随机推荐
MATLAB绘制填充图(X轴上下两种颜色)
【7.31】代码源 - 【矩阵操作】【宝箱】【New Stone Game】【等差数列】
一个接口并发问题的模拟与复现
[NCTF2019]SQLi-1||SQL注入
flask-socketio实现websocket通信
无法启动服务 错误 193 0xc1
JSP第一篇 -----JSP九大内置对象(隐式对象)和四大域对象
【面经】被虐了之后,我翻烂了equals源码,总结如下
EasyGBS播放器优化:设备通道视频播放出现跳屏问题的修复
VS2010 组件列表与对应名称
2022-08-02:小红拿到了一个大立方体,该大立方体由1*1*1的小方块拼成,初始每个小方块都是白色。 小红可以每次选择一个小方块染成红色, 每次小红可能选择同一个小方块重复染色, 每次染色以后,
代码工具推荐
Qt在选择MSVC 编译器的时候,无法识别出M_PI的问题处理
44LVS负载均衡群集-NAT
软件定义网络实验之自定义拓扑开发
【Swoole系列3.3】单进程管理Process
公司代码学习笔记
全栈---Proxy
FLIR E95 在8层楼看马路上行驶的CAR的热成像形态?
SAP ABAP Gateway Client 里 OData 测试的 PUT, PATCH, MERGE 请求有什么区别