使用qt shader写一段绘制动态三角形代码
时间: 2024-03-14 17:47:23 浏览: 21
下面是一段使用Qt Shader绘制动态三角形的代码示例:
```cpp
#include <QApplication>
#include <QOpenGLWidget>
#include <QOpenGLShaderProgram>
#include <QOpenGLFunctions>
#include <QTimer>
class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
MyOpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent)
{
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(16);
}
protected:
void initializeGL() override
{
initializeOpenGLFunctions();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// 创建着色器程序
m_program = new QOpenGLShaderProgram(this);
m_program->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vertex.glsl");
m_program->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/fragment.glsl");
m_program->link();
// 获取着色器程序中的变量位置
m_vertexAttr = m_program->attributeLocation("vertexAttr");
m_colorAttr = m_program->attributeLocation("colorAttr");
m_matrixUniform = m_program->uniformLocation("matrix");
// 初始化顶点数据和颜色数据
m_vertices[0] = QVector3D(-0.5f, -0.5f, 0.0f);
m_vertices[1] = QVector3D(0.5f, -0.5f, 0.0f);
m_vertices[2] = QVector3D(0.0f, 0.5f, 0.0f);
m_colors[0] = QVector3D(1.0f, 0.0f, 0.0f);
m_colors[1] = QVector3D(0.0f, 1.0f, 0.0f);
m_colors[2] = QVector3D(0.0f, 0.0f, 1.0f);
}
void resizeGL(int w, int h) override
{
glViewport(0, 0, w, h);
}
void paintGL() override
{
glClear(GL_COLOR_BUFFER_BIT);
m_program->bind();
// 更新顶点数据和颜色数据
m_vertices[0].setX(m_vertices[0].x() + qSin(m_angle));
m_vertices[1].setX(m_vertices[1].x() + qSin(m_angle));
m_vertices[2].setX(m_vertices[2].x() + qSin(m_angle));
m_colors[0].setY(m_colors[0].y() + 0.01f);
m_colors[1].setY(m_colors[1].y() + 0.01f);
m_colors[2].setY(m_colors[2].y() + 0.01f);
// 绑定顶点数据
m_program->setAttributeArray(m_vertexAttr, m_vertices);
m_program->setAttributeArray(m_colorAttr, m_colors);
// 更新变换矩阵
QMatrix4x4 matrix;
matrix.ortho(-1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 100.0f);
m_program->setUniformValue(m_matrixUniform, matrix);
// 绘制三角形
glDrawArrays(GL_TRIANGLES, 0, 3);
m_program->release();
// 更新角度
m_angle += 0.01f;
}
private:
QOpenGLShaderProgram *m_program;
int m_vertexAttr;
int m_colorAttr;
int m_matrixUniform;
QVector3D m_vertices[3];
QVector3D m_colors[3];
float m_angle = 0.0f;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyOpenGLWidget w;
w.show();
return a.exec();
}
```
其中,vertex.glsl和fragment.glsl分别是顶点着色器和片段着色器的代码,可以根据需要自行编写。在这个例子中,我们每次绘制时更新顶点数据和颜色数据,实现了动态效果。