文章目录


前言

最近开始研究用 QT 做开发来学习 OpenGL ,想着别学完了就忘了,所以准备新开一个 OpenGL 专栏。开发环境已经搭好了,但是没弄教程,最近比较忙,暂时先把核心代码放过来,先开个草率的头儿,后面有时间出个专栏《前传》把搭环境的内容讲讲。

这一篇的主要内容是先展现一下代码,关于 VAO、VBO 还有 EBO 等其他基础知识我会在下一篇好好梳理一下,有兴趣的请关注我的文章目录:【Unity】Unity学习笔记目录整理

绘制目标

在 Qt 中使用 OpenGL 绘制三角形。结果如下:
【OpenGL】OpenGL学习笔记(一):绘制三角形、初识VAO和VBO-LMLPHP

代码如下:

#include "testopenglwidget.h"

unsigned int VBO, VAO;

unsigned int shaderProgram;

float vertices[] = {
    -0.5f, -0.5f, 0.0f,
    0.5f, -0.5f, 0.0f,
    0.0f, 0.5f, 0.0f
};

const char *vertexShaderSource = "#version 330 core\n"
                                "layout (location = 0)  in vec3 aPos;\n" "void main()\n"
                                "{\n"
                                "gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
                                "}\0";
const char *fragmentShaderSource ="#version 330 core\n"
                                "out vec4 FragColor;\n"
                                "void main()\n"
                                "{\n"
                                "FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n\0";

TestOpenGLWidget::TestOpenGLWidget(QWidget *parent) : QOpenGLWidget{parent}
{

}

void TestOpenGLWidget::initializeGL()
{
    initializeOpenGLFunctions();

    // 创建VBO和VAO对象,并赋予id
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);

    // 绑定VBO和VAO
    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    // 为当前绑定到target的缓冲区对象创建一个新的数据存储
    // 如果data不是null,则使用来自此指针的数据初始化数据存储
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    // 告知显卡如何解析缓冲里的属性值
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);

    // 开启VAO管理的第一个属性值
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);

    unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);

    unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource,NULL);
    glCompileShader(fragmentShader);

    shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);

    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
}


void TestOpenGLWidget::resizeGL(int w, int h)
{

}

void TestOpenGLWidget::paintGL()
{
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glUseProgram(shaderProgram);

    glBindVertexArray(VAO);
    glDrawArrays(GL_TRIANGLES, 0, 3);
}


更多内容请查看总目录【Unity】Unity学习笔记目录整理

09-18 04:35