当前位置:网站首页>04 -- QT OpenGL two sets of shaders draw two triangles
04 -- QT OpenGL two sets of shaders draw two triangles
2022-07-03 19:19:00 【Qingsong 0527】
qmyopenglwidget.h
#ifndef QMYOPENGLWIDGET_H
#define QMYOPENGLWIDGET_H
#include <QWidget>
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLShaderProgram>
class QMyOpenglWidget : public QOpenGLWidget, QOpenGLFunctions_3_3_Core
{
Q_OBJECT
public:
explicit QMyOpenglWidget(QWidget* parent = nullptr);
protected:
virtual void initializeGL();
virtual void resizeGL(int w, int h);
virtual void paintGL();
public:
void cretaeShader(QOpenGLShaderProgram& program, QString vShaderFile, QString fShaderFile);
void initTrianggleData(GLuint &vao, float* vertices, GLuint &ebo);
private:
unsigned int vao1;
unsigned int vao2;
unsigned int ebo1;
unsigned int ebo2;
QOpenGLShaderProgram program1;
QOpenGLShaderProgram program2;
signals:
public slots:
};
#endif // QMYOPENGLWIDGET_H
qmyopenglwidget.cpp
#include "qmyopenglwidget.h"
QMyOpenglWidget::QMyOpenglWidget(QWidget* parent):QOpenGLWidget(parent)
{
}
void QMyOpenglWidget::initializeGL()
{
initializeOpenGLFunctions();
float vertices1[] = {
-1.0, 0, 0,
1.0, 0, 0,
0, 1.0f, 0
};
float vertices2[] = {
-1.0, 0, 0,
1.0, 0, 0,
0, -0.5f, 0
};
QString vShaderFile = ":/shader/vertex.vert";
QString fShaderFile = ":/shader/frag.frag";
cretaeShader(program1, vShaderFile, fShaderFile);
initTrianggleData(vao1, vertices1, ebo1);
QString vShaderFile2 = ":/shader/vertex2.vert";
QString fShaderFile2 = ":/shader/frag2.frag";
cretaeShader(program2, vShaderFile2, fShaderFile2);
initTrianggleData(vao2, vertices2, ebo2);
}
void QMyOpenglWidget::initTrianggleData(GLuint &vao, float* vertices, GLuint &ebo)
{
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
unsigned int vbo1;
glGenBuffers(1, &vbo1);
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
// Is currently bound to target Create a new data store for the buffer object //
glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(GL_FLOAT), vertices, GL_STATIC_DRAW);
// Tell the graphics card how to parse the attribute value in the buffer
glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 3*sizeof (GL_FLOAT), nullptr);
// Turn on VAO The first attribute of Management
glEnableVertexAttribArray(0);
unsigned int indexs[] = {
0, 1, 2
};
glGenBuffers(1, &ebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexs), indexs, GL_STATIC_DRAW);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
void QMyOpenglWidget::resizeGL(int w, int h)
{
}
void QMyOpenglWidget::paintGL()
{
glClearColor(0.2f, 0.2f, 0.1f, 0.1f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo1);
program1.bind();
glBindVertexArray(vao1);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, nullptr);
program2.bind();
glBindVertexArray(vao2);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, nullptr);
update();
}
void QMyOpenglWidget::cretaeShader(QOpenGLShaderProgram& program, QString vShaderFile, QString fShaderFile)
{
program.addShaderFromSourceFile(QOpenGLShader::Vertex, vShaderFile);
program.addShaderFromSourceFile(QOpenGLShader::Fragment, fShaderFile);
program.bind();
program.link();
}
vertex.vert
#version 330 core
in vec3 pos;
void main(void)
{
gl_Position = vec4(pos, 1.0f);
}
frag.frag
#version 330 core
out vec4 FragColor; // Clip shader output
void main(void)
{
FragColor = vec4(0.8, 0.8, 0.1, 1.0);
}
Another set shader With this set shader similar
边栏推荐
- Common text labels
- Thesis study - 7 Very Deep Convolutional Networks for Large-Scale Image Recognition (3/3)
- Latex image rotates with title
- Sentinel source code analysis part II - sentinel dashboard console startup and configuration
- [free sharing] kotalog diary2022 plan electronic manual ledger
- Failed to start component [StandardEngine[Catalina]. StandardHost[localhost]. StandardContext
- Read the paper glodyne global topology preserving dynamic network embedding
- Pecan — @expose()
- I study database at station B (4): DQL
- Sustainable service business models
猜你喜欢
第一章:三位阶乘和数,图形点扫描
Why should the gradient be manually cleared before back propagation in pytorch?
EGO Planner代码解析bspline_optimizer部分(2)
第二章:基于分解的求水仙花数,基于组合的求水仙花数, 兰德尔数,求[x,y]内的守形数,探求n位守形数,递推探索n位逐位整除数
Analysis of dart JSON encoder and decoder
Simulation scheduling problem of SystemVerilog (1)
Recommend a GIF processing artifact less than 300K - gifsicle (free download)
【LeetCode】【SQL】刷题笔记
Php based campus lost and found platform (automatic matching push)
第二十章:y= sin(x)/x,漫步坐标系计算,y= sin(x)/x 带廓幅图形,奥运五环,小球滚动与弹跳,流水显示,矩形优化裁剪,r个皇后全控nxn棋盘
随机推荐
The space of C disk is insufficient, and the computer becomes stuck. Quickly expand the capacity of C disk to make the system more smooth
EGO Planner代码解析bspline_optimizer部分(2)
第一章:递归求n的阶乘n!
Thinking about festivals
Basic principle of LSM tree
The online customer service system developed by PHP is fully open source without encryption, and supports wechat customer service docking
Luogu-p1107 [bjwc2008] Lei Tao's kitten
Record: writing MySQL commands
Merge K ascending linked lists
P3402 persistent and searchable
【疾病识别】基于matlab GUI机器视觉肺癌检测系统【含Matlab源码 1922期】
變化是永恒的主題
我們做了一個智能零售結算平臺
BUUCTF
Record: MySQL changes the time zone
【水质预测】基于matlab模糊神经网络水质预测【含Matlab源码 1923期】
第二十章:y= sin(x)/x,漫步坐标系计算,y= sin(x)/x 带廓幅图形,奥运五环,小球滚动与弹跳,流水显示,矩形优化裁剪,r个皇后全控nxn棋盘
Today I am filled with emotion
Thesis study - 7 Very Deep Convolutional Networks for Large-Scale Image Recognition (3/3)
Integrated easy to pay secondary domain name distribution system