通过OpenGL学习001-GLFW环境搭建、OpenGL学习002-配置GLAD的学习,已经为构建GLFW窗口做好了准备,现在开始第一个窗口的创建。
1. 创建工程
ubuntu@ubuntu-VirtualBox:~/Git/OpenGL-Study$ tree
.
├── CMakeLists.txt #CMakeList文件,用于工程构建
├── include #工程自身的头文件
│ └── FirstWindow.h
├── main.cpp #工程的主程序文件
├── README.md #工程的说明文件
├── src
│ └── FirstWindow.cpp #工程的源文件
└── thirdparty #工程用到的第三方头文件、类库
├── glad
│ ├── include
│ │ └── glad.h
│ └── src
│ └── glad.c
├── glfw
│ ├── include
│ │ └── GLFW
│ │ ├── glfw3.h
│ │ └── glfw3native.h
│ └── lib
│ └── libglfw3.a
└── khr
└── include
└── KHR
└── khrplatform.h
创建如上图所示的工程。
2. 创建文件
在include目录下创建头文件FirstWindow.h ,内容如下:
/**
* 软件功能:
* 软件版本: V1.0.0
* 实现时间: 2021-10-29 10:49
* 软件作者:
*/
#ifndef OPENGL_FIRSTWINDOW_H
#define OPENGL_FIRSTWINDOW_H
#include "glad/glad.h"
#include "GLFW/glfw3.h"
#include "FirstWindow.h"
/**
* view回调函数, 随window的变化而变化
* @param window
* @param width
* @param height
*/
void framebuffer_size_callback(GLFWwindow *window, int width, int height);
/**
* 处理键盘事件
* @param window
*/
void processInput(GLFWwindow *window);
/**
* 绘制第一个窗口
* @return
*/
int drawFirstWindow(char *windowName = (char *) "OpenGL Study");
#endif //OPENGL_FIRSTWINDOW_H
在src目录下创建源文件FirstWindow.cpp, 内容如下:
/**
* 软件功能:
* 软件版本: V1.0.0
* 实现时间: 2021-10-29 10:49
* 软件作者:
*/
#include <iostream>
#include "FirstWindow.h"
/**
* view回调函数, 随window的变化而变化
* @param window
* @param width
* @param height
*/
void framebuffer_size_callback(GLFWwindow *window, int width, int height) {
std::cout << "调整位置: " << "width = " << width << " height = " << height << std::endl;
glViewport(0, 0, width, height);
}
/**
* 处理键盘事件
* @param window
*/
void processInput(GLFWwindow *window) {
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
std::cout << "按键esc按下" << std::endl;
glfwSetWindowShouldClose(window, true);
}
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) {
std::cout << "A 键被按下" << std::endl;
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
}
}
/**
* 绘制第一个窗口
* @return
*/
int drawFirstWindow(char *windowName) {
//初始化glfw
glfwInit();
//配置glfw 告知glfw使用的是3.3版本
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
//使用glfw的核心模式
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//MAC系统下
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
//创建glfw窗口 该窗口存放所有与窗口相关的数据
GLFWwindow *window = glfwCreateWindow(800, 600, windowName, NULL, NULL);
if (window == NULL) {
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
//初始化glad, glad用来管理操纵glfw的函数指针
if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)) {
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
glViewport(0, 0, 200, 200);
//注册回调函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//渲染循环, 在窗口未接到关闭事件时,glfw一直保持运行
while (!glfwWindowShouldClose(window)) {
//注册键盘事件处理
processInput(window);
//颜色缓冲交换 该缓冲存储glfw窗口上每个像素值, 像素值用于在窗口上绘制并输出
glfwSwapBuffers(window);
//获取窗口上的事件(鼠标、键盘事件, 窗口变更事件)
glfwPollEvents();
}
//渲染结束,释放资源
glfwTerminate();
return 0;
}
在主程序文件main.cpp中调用 FirstWindow
#include "FirstWindow.h"
#include <iostream>
int main() {
// std::cout << "Hello, World!" << std::endl;
// 绘制第一个窗口
drawFirstWindow((char *) "China");
return 0;
}
3 编辑CMakeList
#cmake最低依赖版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
#项目名称
PROJECT(OpenGL)
#指定C++版本
SET(CMAKE_CXX_STANDARD 14)
#将引用的第三方的头文件目录添加至编译器的头文件搜索路径中,指定的目录被解释成当前源码路径的相对路径
INCLUDE_DIRECTORIES(./thirdparty/glfw/include)
INCLUDE_DIRECTORIES(./thirdparty/glad/include)
INCLUDE_DIRECTORIES(./thirdparty/khr/include)
#将项目自身的头文件目录添加至编译器的头文件搜索路径中,指定的目录被解释成当前源码路径的相对路径。
INCLUDE_DIRECTORIES(./include)
#添加需要链接的库文件目录
LINK_DIRECTORIES(./thirdparty/glfw/lib)
LINK_DIRECTORIES(/usr/lib/X11)
#消息打印
MESSAGE("====compile system type========" ${CMAKE_SYSTEM_NAME})
if (UNIX)
FIND_PACKAGE(X11 REQUIRED)
MESSAGE("x11******************************" ${X11_X11_INCLUDE_PATH})
FIND_PACKAGE(PkgConfig REQUIRED)
endIf ()
SET(CMAKE_CXX_FLAGS "-g -Wall")
SET(SRC_FILES
main.cpp
thirdparty/glad/src/glad.c
src/FirstWindow.cpp
)
#指定生成目标文件
ADD_EXECUTABLE(OpenGL main.cpp ${SRC_FILES})
#添加链接库 静态库&动态库
TARGET_LINK_LIBRARIES(${PROJECT_NAME} libglfw3.a dl pthread X11)
4. 构建
ubuntu@ubuntu-VirtualBox:~/C_ENV/OpenGL$ pwd
/home/ubuntu/C_ENV/OpenGL
ubuntu@ubuntu-VirtualBox:~/C_ENV/OpenGL$ mkdir build
ubuntu@ubuntu-VirtualBox:~/C_ENV/OpenGL$ cd build/
ubuntu@ubuntu-VirtualBox:~/C_ENV/OpenGL/build$ cmake ..
ubuntu@ubuntu-VirtualBox:~/C_ENV/OpenGL/build$ make -j2
此时在当前构建目录下可以看到可执行文件 OpenGL
ubuntu@ubuntu-VirtualBox:~/C_ENV/OpenGL/build$ ll
total 540
drwxrwxr-x 3 ubuntu ubuntu 4096 10月 29 12:30 ./
drwxrwxr-x 8 ubuntu ubuntu 4096 10月 29 12:30 ../
-rw-rw-r-- 1 ubuntu ubuntu 24256 10月 29 12:30 CMakeCache.txt
drwxrwxr-x 5 ubuntu ubuntu 4096 10月 29 12:30 CMakeFiles/
-rw-rw-r-- 1 ubuntu ubuntu 1502 10月 29 12:30 cmake_install.cmake
-rw-rw-r-- 1 ubuntu ubuntu 6594 10月 29 12:30 Makefile
-rwxrwxr-x 1 ubuntu ubuntu 502824 10月 29 12:30 OpenGL* #可执行文件
5 运行
ubuntu@ubuntu-VirtualBox:~/C_ENV/OpenGL/build$ ./OpenGL
可以看到窗口
按A键可以看到窗口变色
按ESC键,程序退出
至此,使用GLFW创建窗口的流程便结束了。