最近一直在看OpenGL相关的内容,网上有一个非常好的网站可以学习网站,目前的计划是按照这个网站先把OpenGL基础知识掌握
英文版地址:https://learnopengl.com/
中文版地址:https://learnopengl-cn.github.io/
项目结构和开发环境配置
为什么使用CMake?
通过CMake可以生成不同环境下的项目配置包括vs,make,xcode等
依赖的三方库也都是使用CMake进行构建
另外就是练习自己对CMake的使用
- 项目目录结构如下,其中除了vendor目录主要放三方依赖库
- 项目基础CMake配置
cmake_minimum_required(VERSION 3.0)
project(LearnOpenGL)
set(CMAKE_CXX_STANDARD 11)
# 设置编译导出路径
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
# 主要针对去除msvc下printf等函数的警告
if(WIN32)
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
endif(WIN32)
set(HEADERS
# 添加头文件
)
set(SOURCES
# 添加源代码文件
)
include_directories(include src)
# 设置资源文件
file(GLOB_RECURSE RESOURCES "res/*.vert" "res/*.frag", "res/*.png")
source_group("Resources" FILES ${RESOURCES})
# 配置最终生成的可执行程序的文件名以及依赖的源码和资源文件
add_executable(LearnOpenGL ${RESOURCES} ${SOURCES} ${HEADERS})
# 设置链接生成可执行程序时依赖的库
target_link_libraries(LearnOpenGL)
glfw获取
- 进入vendor目录执行以下命令获取glfw源码
git clone https://github.com/glfw/glfw.git
- 完成后看到如下的内容
- 然后设置目标文件的链接依赖,将target_link_libraries改成如下的配置
target_link_libraries(LearnOpenGL glfw)
glad获取
- 使用在线服务生成相应的代码传送门(我的选择如下,仅供参考)
- 下载glad
- 在vendor目录下创建glad,然后将下载好的代码包解压放入
- 在目录下创建CMakeLists.txt文件配置glad,以下是我的配置(仅供参考)
cmake_minimum_required(VERSION 3.0)
project(glad VERSION 0.1.33 LANGUAGES C)
set(GLAD_SOURCES src/glad.c)
file(GLOB_RECURSE GLAD_HEADERS "include/*.h")
add_library(glad STATIC ${GLAD_SOURCES} ${GLAD_HEADERS})
target_include_directories(glad PUBLIC include)
引用glfw和glad进入项目中
引用这两个库就比较简单了,在项目的CMakeLists.txt进行如下配置
# 加入glad进入项目
add_subdirectory(vendor/glad)
# 加入glfw我使用动态库的方式,也可改成静态库
set(BUILD_SHARED_LIBS ON)
# 这个参数主要是去除生成glfw的api文档
set(GLFW_BUILD_DOCS OFF)
add_subdirectory(vendor/glfw)
# 修改可执行程序链接库,这里只需要将上面的基础CMakeLists.txt中的最后一行进行修改
target_link_libraries(LearnOpenGL glad glfw)
验证环境是否正常
- 在src目录下新建main.cpp写入如下代码
#ifdef _WIN32
#define APIENTRY __stdcall
#endif
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
static const int SCREEN_WIDTH = 800;
static const int SCREEN_HEIGHT = 600;
int main(int argc, char* argv[]) {
// initialize
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_SAMPLES, 4);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// fix compilation on OS X
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
auto window = glfwCreateWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "Learn OpenGL", nullptr, nullptr);
if (!window) {
std::cout << "Failed to create window." << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
if (!gladLoadGL()) {
std::cout << "Failed to initialize GLAD." << std::endl;
glfwTerminate();
return -1;
}
std::cout << glGetString(GL_VERSION) << std::endl;
while (!glfwWindowShouldClose(window)) {
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
- 在项目CMakeLists.txt中修改项目源文件
set(SOURCES
# 添加源代码文件
src/main.cpp
)
- 编译运行项目如果看到这样的窗口那么说明配置成功啦
总结
经过这么一番折腾之后,对于CMake管理C/C++项目更加熟练
另外我的编辑器没有使用vs而是使用的VSCode,也学会了如何利用VSCode+CMake来开发C/C++项目
经过以上的准备工作,接下来可以愉快的学习使用OpenGL啦
最后加油吧,少年
网友评论