#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QGLWidget> #include <QOpenGLShader> #include <QOpenGLShaderProgram> #include <QDebug> #include <QOpenGLFunctions> #include <QOpenGLFunctions_3_3_Core> #include <QTime> #include <QtMath> #include <QTimer> namespace Ui { class Widget; } class Triangle : public QGLWidget, protected QOpenGLFunctions { Q_OBJECT public: explicit Triangle(); ~Triangle(); protected: virtual void initializeGL(); virtual void paintGL(); virtual void resizeGL(int w, int h); private: GLuint shaderProgram; QOpenGLFunctions_3_3_Core *core; shader *ourShader; }; #endif // WIDGET_H
#include "widget.h" #include "ui_widget.h" GLuint VBO, VAO; const char *vertexShaderSource ="#version 330 core\n" "layout (location = 0) in vec3 aPos;\n" "void main()\n" "{\n" " gl_Position = vec4(aPos, 1.0);\n" "}\0"; const char *fragmentShaderSource = "#version 330 core\n" "out vec4 FragColor;\n" "uniform vec4 ourColor;\n" "void main()\n" "{\n" " FragColor = ourColor;\n" "}\n\0"; Triangle::Triangle() { } Triangle::~Triangle() { } void Triangle::initializeGL() { //着色器部分 core = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>(); if (!core) { qWarning() << "Could not obtain required OpenGL context version"; exit(1); } GLuint vertexShader = core->glCreateShader(GL_VERTEX_SHADER); core->glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr); core->glCompileShader(vertexShader); // check for shader compile errors int success; char infoLog[512]; core->glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); if (!success) { core->glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog); qDebug() << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << endl; } // fragment shader GLuint fragmentShader; fragmentShader = core->glCreateShader(GL_FRAGMENT_SHADER); core->glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr); core->glCompileShader(fragmentShader); core->glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if (!success) { core->glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog); qDebug() << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << endl; } shaderProgram = core->glCreateProgram(); core->glAttachShader(shaderProgram, vertexShader); core->glAttachShader(shaderProgram, fragmentShader); core->glLinkProgram(shaderProgram); core->glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); if (!success) { core->glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog); qDebug() << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << endl; } core->glDeleteShader(vertexShader); core->glDeleteShader(fragmentShader); float vertices[] = { // positions // colors 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom right -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // bottom left 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f // top }; core->glGenVertexArrays(1, &VAO); core->glGenBuffers(1, &VBO); core->glBindVertexArray(VAO); core->glBindBuffer(GL_ARRAY_BUFFER, VBO); core->glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); core->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), nullptr); core->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), (void*)(3 * sizeof(float))); core->glEnableVertexAttribArray(0); QTimer *timer = new QTimer(this); timer->setInterval(100); connect(timer, &QTimer::timeout, this, [=](){ repaint();}); timer->start(); } void Triangle::paintGL() { core->glClearColor(0.2f, 0.3f, 0.3f, 1.0f); core->glClear(GL_COLOR_BUFFER_BIT); core->glUseProgram(shaderProgram); core->glBindVertexArray(VAO); float timeValue = QTime(0,0,0).msecsTo(QTime::currentTime())/1000.0f; float greenValue = qSin(timeValue) / 2.0f + 0.5f; qDebug()<<"greenValue"<<greenValue; int vertexColorLocation = core->glGetUniformLocation(shaderProgram, "ourColor"); core->glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f); core->glDrawArrays(GL_TRIANGLES, 0, 3); core->glUseProgram(0); } void Triangle::resizeGL(int w, int h) { core->glViewport(0, 0, w, h); }
原文:https://www.cnblogs.com/ch122633/p/12069578.html