当前位置:网站首页>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

边栏推荐
- Pecan — @expose()
- Go home early today
- 我们做了一个智能零售结算平台
- FBI警告:有人利用AI换脸冒充他人身份进行远程面试
- This Chinese numpy quick look-up table is too easy!
- Free sharing | linefriends hand account inner page | horizontal grid | not for sale
- 【光学】基于matlab涡旋光产生【含Matlab源码 1927期】
- 第一章:三位阶乘和数,图形点扫描
- [academic related] how to find the innovation of top papers? Chinese universities won the CVPR Best Student Thesis Award for the first time
- Sentinel source code analysis part I sentinel overview
猜你喜欢

Summary of composition materials for 2020 high-frequency examination center of educational resources

Octopus online ecological chain tour Atocha protocol received near grant worth $50000

第二章:求a,b的最大公约与最小公倍数经典求解,求a,b的最大公约与最小公倍数常规求解,求n个正整数的的最大公约与最小公倍数

BUUCTF
![[leetcode] [SQL] notes](/img/8d/160a03b9176b8ccd8d52f59d4bb47f.png)
[leetcode] [SQL] notes

Free sharing | linefriends hand account inner page | horizontal grid | not for sale

SQL injection for Web Security (1)

How to build an efficient information warehouse

EGO Planner代码解析bspline_optimizer部分(3)

Driveseg: dynamic driving scene segmentation data set
随机推荐
Counting from the East and counting from the West will stimulate 100 billion industries. Only storage manufacturers who dare to bite the "hard bone" will have more opportunities
SSM integration - joint debugging of front and rear protocols (list function, add function, add function status processing, modify function, delete function)
Php based campus lost and found platform (automatic matching push)
Pecan — Overview
I study database at station B (4): DQL
记录在模拟器中运行flutter时报的错
为什么要做特征的归一化/标准化?
Merge K ascending linked lists
Read the paper glodyne global topology preserving dynamic network embedding
Summary of learning materials and notes of Zhang Fei's actual combat electronics 1-31
This Chinese numpy quick look-up table is too easy!
Day18 - basis of interface testing
Succession of flutter
Next spread
HOW TO WRITE A DAILY LAB NOTE?
變化是永恒的主題
The online customer service system developed by PHP is fully open source without encryption, and supports wechat customer service docking
[wallpaper] (commercially available) 70 wallpaper HD free
Analyse du Code du planificateur ego bspline Section Optimizer (1)
ActiveMQ的基础