OpenGL环境搭建

OpenGL(Open Graphics Library)是一个2D、3D图形渲染库,它实际上并不是一种API,而是一种标准规范,规定了每个接口应该提供什么样的功能,也就是说它不关心内部实际实现,因为不同平台、不同设备上的接口实现总是不一样的,不同的系统、显卡、显卡驱动,都要求按照不同的系统API实现开发所需的对象创建和管理、音视频处理等,对编程者要求较高,因此OpenGL引入了各种库,例如GLUT,SDL,SFML和GLFW等,用于抽象和屏蔽底层的实现差异,实现使用统一的接口调用不同平台API的方法。

也由于OpenGL实现随平台变化的特点,显卡、驱动版本、系统版本都可能导致一些函数失效,或者通过宏支持新的函数功能,因此大多数函数的运行地址是运行期才真正确定,导致OpenGL的函数逻辑需要经过寻找函数指针-绑定对象-创建/操作对象的过程,例如在windows上,需要通过wglGetProcAddress获取函数指针再使用:

1
2
3
4
5
6
7
// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, &buffer);
这也意味着很大的工作量,过去glew库完成了这个过程,但出于对于新特性支持和功能完善性,目前更多的OpenGL项目采用glad库,使得调用过程变得简化。

搭建环境:Windows系统已经自带部分OpenGL的渲染库opengl32.lib,只需要再引入glad和glfw即可,总体环境如下:

cmake编译glfw 3.4

glfw 3.4下载源码release,使用cmake ui编译即可,编译步骤可以参考OpenCV C++记录(一):基于MinGW的环境搭建

只需要configure时,注意将install路径修改成其他路径,不要使用系统盘作为库调用路径,以免污染或者创建权限不足。

完成后编译和打包成库文件即可:

1
2
mingw32-make -j 8
mingw32-make install

在线生成glad

glad提供了在线下载网站,修改API gl为Version 4.6profile选择Core,其余默认,点击生成,下载对应压缩包即可。

得到后解压并且打包:

1
2
gcc .\src\glad.c -c -I .\include
ar -rc libglad.a glad.o

至此,必须的库和头文件都就绪了。

cmake链接与验证

如果是Vscode,得确保编译器使用的是mingw而非MSVC,对于Cmake项目,使用ctrl+shift+p,查找Cmake:Select a Kit,选择mingw即可。

在cmake项目中只需要类似这样即可正常使用OpenGL:

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
26
27
28
cmake_minimum_required(VERSION 3.10.0)
project(OpenGLTest)

set(CXX_STANDARD 17)

find_package(OpenGL REQUIRED) #系统自带gl渲染库

add_executable(${PROJECT_NAME})

target_sources(${PROJECT_NAME} PRIVATE
main.cpp
)

target_include_directories(${PROJECT_NAME} PRIVATE
D:/glfw-3.4/stage/include
D:/glfw-3.4/glad/include
)

target_link_directories(${PROJECT_NAME} PRIVATE
D:/glfw-3.4/stage/lib
D:/glfw-3.4/glad
)

target_link_libraries(${PROJECT_NAME} PRIVATE
glad
glfw3
OpenGL::GL
)

一个验证程序如下:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<glad/glad.h>   ///glad需要在glfw之前,否则可能报错
#include<GLFW/glfw3.h>

#include<iostream>

// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;

const unsigned int VIEW_WIDTH = 800;
const unsigned int VIEW_HEIGHT = 600;

void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
std::cout << "Call frame buffer callback function!" << std::endl;
glViewport(0, 0, width, height);
}

int main()
{
int glfwState = glfwInit();
if (glfwState == GLFW_FALSE){
std::cout << "GLFW initialize failed!" << std::endl;
exit(EXIT_FAILURE);
}

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Hello OpenGL", NULL, NULL);
if (window == NULL){
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);

// glad: load all OpenGL function pointers
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}


glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//glfwSetKeyCallback
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
while (!glfwWindowShouldClose(window)){
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}

效果:出现灰绿色的背景框 验证

Q&A

  1. Cmake点击generate时出现:Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
  • 这主要是来自CMakeLists要求的C++文档生成工具,windows可通过doxygen安装即可。
  1. 程序编译出现:LINK : fatal error LNK1104: 无法打开文件“glad.lib” [F:\OpenGL\openglTest\build\OpenGLTest.vcxproj]
  • 打开main程序的build构建目录进一步确认,如果存在sln文件说明是cmake编译没有启用MinGW编译器,而是使用了VS的MSVC,应该按上述所说:vscode中使用ctrl+shift+p,查找Cmake:Select a Kit,选择mingw即可,编译前将旧的build文件夹删掉。
  1. 程序编译出现:生成的生成配置不包含活动生成配置。对 CMAKE_BUILD_TYPE 使用 "" 而不是 "Debug",以确保可以找到 IntelliSense 配置;
  • vscode中使用ctrl+shift+p,查找CMake: Select Variant,选择要Debug还是Release版本。