一.下载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