#include "WidgetGL1.h" #include #include #include "spdlog/spdlog.h" WidgetGL1::WidgetGL1(QWidget *parent) { } WidgetGL1::~WidgetGL1() { } void WidgetGL1::initializeGL() { /* 初始化OpenGL函数 */ initializeOpenGLFunctions(); /* 顶点输入 */ float vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f }; /* 顶点缓冲对象 */ GLuint VBO; glGenBuffers(1, &VBO); /* 将VBO绑定到缓冲对象上(其实是用于激活这个VBO对象,可以对这个对象进行操作了) 说明:OpenGL的对象操作都要依赖OpenGL提供的函数,有很多对象类型,这里将VBO绑定在 GL_ARRAY_BUFFER 上,就像放在了对应的操作台上,之后就可以对这个对象进行 操作,后续的一切对 GL_ARRAY_BUFFER 的操作就是对VBO的操作 */ glBindBuffer(GL_ARRAY_BUFFER, VBO); /* 将数据拷贝到VBO中 */ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); /* 顶点着色器 */ const char* vertexShaderSource = R"( #version 330 core layout (location = 0) in vec3 aPos; void main() { gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); } )"; /* 创建顶点着色器对象 */ GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); /* 加载顶点着色器源码 */ glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr); /* 编译着色器 */ glCompileShader(vertexShader); printOpenGLCompileError(vertexShader); } void WidgetGL1::resizeGL(int w, int h) { } void WidgetGL1::paintGL() { } /* 打印编译错误 */ void WidgetGL1::printOpenGLCompileError(GLuint errorCode) { int sucess; char infoLog[512]; glGetShaderiv(errorCode, GL_COMPILE_STATUS, &sucess); if (!sucess) { glGetShaderInfoLog(errorCode, 512, nullptr, infoLog); SPDLOG_ERROR("OpenGL编译错误: {}", infoLog); } }