OpenGL教程:1. GLFW和GLAD的初始化

OpenGL是图形API,是一种规范。他作为最古老的图形API,无论是后起之秀DirectX和Vulkan,都遵循这种规范。

既然是一种API,那么他就是一种图形接口,供用户去实现一些图形的操作。具体来说,这一过程如下:

这说明,各大显卡厂商根据OpenGL制定相对应的显卡(不止是OpenGL,还有DirectX和Vulkan等图形API)。用户通过GLFW和GLAD“对接API”。最后才能实现真正的图形编程。可能你目前还看不懂这些术语,之后会好好解释的。

入门计算机图形学,需要有良好的数学基础,以及编码能力。我们主要采用C++语言编程OpenGL。需要说明的是,Python、Java和Golang都可以编程OpenGL,并且在这方面的语法是出奇的相似。建议挑选自己熟悉的语言学习。(但我仍然强烈推荐用C++,问就是效率高而且高自定义性)

最后,要强调的是,OpenGL是一个巨大的状态机,每一条gl的语句都是一种状态。这一点需要明确,这对后面对OpenGL代码的理解有着重要的作用。

GLFW和GLAD

究竟什么是GLFW和GLAD?

首先还是要强调的是,OpenGL是一种标准一种规范。所以官方是没有为OpenGL专门开发函数库的。OpenGL只有框架没有实现,换句话说就是OpenGL只有函数声明没有源文件实现,类似于接口和虚函数。这意味着我们要想图形编程。首先得找到对应语言中专门开发OpenGL的函数库。这就是GLFW和GLAD的由来原因了。

GLFW简单来说,就是一种针对C语言的OpenGL库,它允许用户创建OpenGL窗口,定义窗口参数以及定义键鼠输入的回调函数。简单来说,GLFW就是控制OpenGL窗口相关的事件和参数的一种OpenGL函数库。GLFW的函数常常以glfw开头。

而GLAD就侧重于图形开发的部分了。它是OpenGL的函数指针库,是基于官方规格的多语言GL、GLES、EGL、GLX、WGL装载机/生成器。简单来说,GLAD侧重于一个OpenGL程序中图形渲染的部分。GLAD的函数常常以gl开头。

另外一种搭配就是GLUT/GLEW,其中前者与GLFW效果相同,后者与GLAD效果相同。

所以,我们在编程的时候,首先需要对GLFW初始化,毕竟没有窗口还渲染什么图形。然后在初始化GLAD。

第一个窗口

在这节之前请先配置好GLFW/GLAD的环境。

在C++程序中,一般格式为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "GLFW/glfw3.h"
#include "glad/glad.h"
#include <iostream>

int main() {
glfwInit(); //GLFW初始化
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //主版本号为3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //次版本号为3
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //声明核心

GLFWwindow *window = glfwCreateWindow(800, 600, "第一个窗口", nullptr, nullptr); //创建窗口
if (window == nullptr) {
std::cout << "Error: Fail to create window! \n";
glfwTerminate();
return -1;
}

glfwMakeContextCurrent(window); //必备语句,切换上下文

//初始化GLAD
if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)) {
std::cout << "Error: Fail to initialize GLAD! \n";
return -1;
}
...

main函数中,我们先初始化了GLFW,并且声明了GLFW的版本(常用3.3版本)。然后创建了一个GLFW窗口,第一二个参数为窗口的分辨率(大小),第三个参数为窗口的名字。

之后做的if判断是判断窗口生成成功了么,如果失败了就终止程序。

创建完窗口我们就可以通知GLFW将我们窗口的上下文设置为当前线程的主上下文了。

之后初始化GLAD,执行gladLoadGLLoader的同时可以作为if的判断依据,方便判断GLAD是否初始化成功。

Author

InverseDa

Posted on

2022-11-01

Updated on

2023-03-30

Licensed under

Comments

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×