QT + opengl 环境搭建(glfw, glad),创建一个简单窗口

本文介绍了如何在Qt项目中下载并配置glfw库用于OpenGL接口封装,以及使用glad处理OpenGL函数指针。还详细说明了如何创建一个OpenGL窗口,并提供了相关代码和资源链接。
摘要由CSDN通过智能技术生成

一.下载glfw,glad并编译

        1.glfw个人理解就是对底层opengl的一些基本接口的封装,提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文、定义窗口参数以及处理用户输入。glfw的下载地址:Download | GLFW,下载完成后,打开cmake,设置工程路径和编译路径,生成sln工程,选择x86进行编译,得到库3.3.9版本glfw3.lib。

        2.glad,是一个开源的库,由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以,我们为了解决运行时去正确调用opengl的接口,我们需要用到glad。封装的接口就是一个对opengl函数指针的封装。打开GLAD的在线服务(glad.dav1d.de),将语言(Language)设置为C/C++,在API选项中,选择3.3以上的OpenGL(gl)版本。之后将模式(Profile)设置为Core,并且保证选中了生成加载器(Generate a loader)选项。现在可以先(暂时)忽略扩展(Extensions)中的内容。都选择完之后,点击生成(Generate)按钮来生成库文件。

然后下载glad.zip。

二. Qt 配置相关库

        1.glad的配置

        2.glad.pri

INCLUDEPATH += $$PWD/include
SOURCES += \
    $$PWD/src/glad.c

        3.glfw3.3.9配置

     

        4.glfw.pri

INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/lib -lglfw3

三.搭建QT工程。我们创建一个非QT的工程,看看相关的依赖库有哪些?

TEMPLATE = app
CONFIG += console c++17
CONFIG -= app_bundle
CONFIG -= qt

include($$PWD/../../thirdparty/glad/glad.pri)
include($$PWD/../../thirdparty/glfw-3.3.9/glfw.pri)

LIBS += -lopengl32 -lkernel32 -luser32 -lgdi32 -lshell32

SOURCES += \
        main.cpp

图中链接的相关库,opengl32,kernel32,user32,gdi32,shell32解决你编译发生的所有错误。vs下开发默认是继承的这些链接库,不用链接。

四.创建一个opengl窗口。

#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
using namespace std;

void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}

int main()
{
    // glad加载
    if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "failed to init glad!" << std::endl;
    }

    // 告知opengl我们使用的版本和渲染模式
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    // mac 下需要这句话
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    // end

    // 创建opengl窗口
    GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }

    // 创建上下文
    glfwMakeContextCurrent(window);
    // 渲染窗口自适应
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
    // 等待用户关闭窗口
    while(!glfwWindowShouldClose(window))
    {
        // 双缓冲交换
        glfwSwapBuffers(window);
        // 响应各种交互事件
        glfwPollEvents();
    }
    // 释放资源
    glfwTerminate();
    return 0;
}

五.工程代码地址:learningOpengl: 一起学习opengl

六.学习地址:主页 - LearnOpenGL CN 

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先需要了解VBO(Vertex Buffer Object)是OpenGL中用于存储顶点数据的一种缓存对象。它可以将顶点数据存储在显存中,以加快渲染速度。 下面是使用glfw创建一个VBO的代码示例,并加上注释: ```c++ #include <GLFW/glfw3.h> int main(void) { GLFWwindow* window; // 初始化glfw if (!glfwInit()) return -1; // 创建窗口 window = glfwCreateWindow(640, 480, "VBO Example", NULL, NULL); if (!window) { glfwTerminate(); return -1; } // 将窗口设置为当前上下文 glfwMakeContextCurrent(window); // 定义顶点数据 float vertices[] = { -0.5f, -0.5f, 0.5f, -0.5f, 0.0f, 0.5f }; // 创建一个VBO对象 GLuint vbo; glGenBuffers(1, &vbo); // 绑定VBO对象 glBindBuffer(GL_ARRAY_BUFFER, vbo); // 将顶点数据复制到VBO中 glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 渲染循环 while (!glfwWindowShouldClose(window)) { // 清空屏幕 glClear(GL_COLOR_BUFFER_BIT); // 绘制三角形 glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableVertexAttribArray(0); // 交换缓冲区 glfwSwapBuffers(window); // 处理事件 glfwPollEvents(); } // 释放VBO对象 glDeleteBuffers(1, &vbo); // 终止glfw glfwTerminate(); return 0; } ``` 注释已经添加在代码中,可以帮助理解每一步的作用。需要注意的是,这里使用的是静态绘制方式(GL_STATIC_DRAW),也就是顶点数据只会被复制一次,并且多次渲染都会使用这些数据。如果需要动态更新VBO中的数据,可以使用其他绘制方式,例如GL_DYNAMIC_DRAW。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cs821984831

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值