OpenGL C++记录(一):基于MinGw的环境搭建
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);
搭建环境:Windows系统已经自带部分OpenGL的渲染库opengl32.lib
,只需要再引入glad和glfw即可,总体环境如下:
cmake编译glfw 3.4
在glfw 3.4下载源码release,使用cmake ui编译即可,编译步骤可以参考OpenCV C++记录(一):基于MinGW的环境搭建
只需要configure时,注意将install路径修改成其他路径,不要使用系统盘作为库调用路径,以免污染或者创建权限不足。
完成后编译和打包成库文件即可: 1
2mingw32-make -j 8
mingw32-make install
在线生成glad
glad提供了在线下载网站,修改API
gl为Version 4.6
,profile
选择Core
,其余默认,点击生成,下载对应压缩包即可。
得到后解压并且打包: 1
2gcc .\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
28cmake_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
// 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
- Cmake点击generate时出现:
Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
:
- 这主要是来自CMakeLists要求的C++文档生成工具,windows可通过doxygen安装即可。
- 程序编译出现:
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文件夹删掉。
- 程序编译出现:
生成的生成配置不包含活动生成配置。对 CMAKE_BUILD_TYPE 使用 "" 而不是 "Debug",以确保可以找到 IntelliSense 配置;
- vscode中使用
ctrl+shift+p
,查找CMake: Select Variant
,选择要Debug还是Release版本。