#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);
}