Browse Source

V1.1.10
1、添加了OpenGL的顶点缓冲对象

apple 2 days ago
parent
commit
4795395c23

+ 54 - 0
demo/OpenGLDemo/GLLearning/WidgetGL1.cpp

@@ -1,6 +1,10 @@
 #include "WidgetGL1.h"
+#include <gl/gl.h>
+#include <qopenglext.h>
 
 
+#include "spdlog/spdlog.h"
+
 
 WidgetGL1::WidgetGL1(QWidget *parent)
 {
@@ -15,7 +19,43 @@ 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)
@@ -27,3 +67,17 @@ 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);
+    }
+
+}

+ 6 - 1
demo/OpenGLDemo/GLLearning/WidgetGL1.h

@@ -8,7 +8,7 @@
 
 
 
-class WidgetGL1 : public QOpenGLWidget
+class WidgetGL1 : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core
 {
     Q_OBJECT
 public:
@@ -18,6 +18,11 @@ protected:
     void initializeGL() override;
     void resizeGL(int w, int h) override;
     void paintGL() override;
+
+private:
+    /* 打印编译错误 */
+    void printOpenGLCompileError(GLuint errorCode);
+
 };
 
 

+ 1 - 1
demo/OpenGLDemo/GLWidget/PlayerGLWidget.h

@@ -11,7 +11,7 @@
 
 /**
  * @brief 
- * 
+ * 0
  */
 
 

+ 1 - 1
demo/OpenGLDemo/widget.cpp

@@ -33,7 +33,7 @@ Widget::Widget(QWidget *parent)
     // m_timer.setSingleShot(false);
     // m_timer.start(10); // 60 FPS
 
-    // auto gl1 = new WidgetGL1(ui->
+    auto gl1 = new WidgetGL1(ui->widget_display);
     
 }