最近一直在看OpenGL相關(guān)的內(nèi)容九默,網(wǎng)上有一個(gè)非常好的網(wǎng)站可以學(xué)習(xí)網(wǎng)站,目前的計(jì)劃是按照這個(gè)網(wǎng)站先把OpenGL基礎(chǔ)知識掌握
英文版地址:https://learnopengl.com/
中文版地址:https://learnopengl-cn.github.io/
項(xiàng)目結(jié)構(gòu)和開發(fā)環(huán)境配置
為什么使用CMake汤踏?
通過CMake可以生成不同環(huán)境下的項(xiàng)目配置包括vs,make,xcode等
依賴的三方庫也都是使用CMake進(jìn)行構(gòu)建
另外就是練習(xí)自己對CMake的使用
-
項(xiàng)目目錄結(jié)構(gòu)如下稿饰,其中除了vendor目錄主要放三方依賴庫
- 項(xiàng)目基礎(chǔ)CMake配置
cmake_minimum_required(VERSION 3.0)
project(LearnOpenGL)
set(CMAKE_CXX_STANDARD 11)
# 設(shè)置編譯導(dǎo)出路徑
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等函數(shù)的警告
if(WIN32)
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
endif(WIN32)
set(HEADERS
# 添加頭文件
)
set(SOURCES
# 添加源代碼文件
)
include_directories(include src)
# 設(shè)置資源文件
file(GLOB_RECURSE RESOURCES "res/*.vert" "res/*.frag", "res/*.png")
source_group("Resources" FILES ${RESOURCES})
# 配置最終生成的可執(zhí)行程序的文件名以及依賴的源碼和資源文件
add_executable(LearnOpenGL ${RESOURCES} ${SOURCES} ${HEADERS})
# 設(shè)置鏈接生成可執(zhí)行程序時(shí)依賴的庫
target_link_libraries(LearnOpenGL)
glfw獲取
- 進(jìn)入vendor目錄執(zhí)行以下命令獲取glfw源碼
git clone https://github.com/glfw/glfw.git
-
完成后看到如下的內(nèi)容
- 然后設(shè)置目標(biāo)文件的鏈接依賴缰儿,將target_link_libraries改成如下的配置
target_link_libraries(LearnOpenGL glfw)
glad獲取
- 使用在線服務(wù)生成相應(yīng)的代碼傳送門(我的選擇如下畦粮,僅供參考)
- 下載glad
- 在vendor目錄下創(chuàng)建glad,然后將下載好的代碼包解壓放入
- 在目錄下創(chuàng)建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進(jìn)入項(xiàng)目中
引用這兩個(gè)庫就比較簡單了宣赔,在項(xiàng)目的CMakeLists.txt進(jìn)行如下配置
# 加入glad進(jìn)入項(xiàng)目
add_subdirectory(vendor/glad)
# 加入glfw我使用動態(tài)庫的方式,也可改成靜態(tài)庫
set(BUILD_SHARED_LIBS ON)
# 這個(gè)參數(shù)主要是去除生成glfw的api文檔
set(GLFW_BUILD_DOCS OFF)
add_subdirectory(vendor/glfw)
# 修改可執(zhí)行程序鏈接庫瞪浸,這里只需要將上面的基礎(chǔ)CMakeLists.txt中的最后一行進(jìn)行修改
target_link_libraries(LearnOpenGL glad glfw)
驗(yàn)證環(huán)境是否正常
- 在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;
}
- 在項(xiàng)目CMakeLists.txt中修改項(xiàng)目源文件
set(SOURCES
# 添加源代碼文件
src/main.cpp
)
- 編譯運(yùn)行項(xiàng)目如果看到這樣的窗口那么說明配置成功啦
總結(jié)
經(jīng)過這么一番折騰之后儒将,對于CMake管理C/C++項(xiàng)目更加熟練
另外我的編輯器沒有使用vs而是使用的VSCode,也學(xué)會了如何利用VSCode+CMake來開發(fā)C/C++項(xiàng)目
經(jīng)過以上的準(zhǔn)備工作对蒲,接下來可以愉快的學(xué)習(xí)使用OpenGL啦
最后加油吧钩蚊,少年