# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目。
#
cmake_minimum_required (VERSION 3.8)
project ("OpenGLPrj")
# 包含子项目。
# 链接OpenGL库
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lOpenGL32")
# 链接GLEW库
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lglew32")
# 链接GLFW库
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lglfw3")
# 链接 spdlog
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lspdlog")
find_package(OpenGL REQUIRED)
if(OpenGL_FOUND)
include_directories(
"3rd_party/glew2.1.0/include"
"3rd_party/glfw3.8/include"
"3rd_party/glad/include"
"3rd_party/spdlog/include"
"3rd_party/glm")
link_directories(
"3rd_party/glew2.1.0/lib"
"3rd_party/glfw3.8/lib"
"3rd_party/spdlog/lib")
set(HAVE_OpenGL)
message(STATUS "Configure package with OpenGL!")
else()
set(HAVE_OpenGL False)
message(STATUS "Configure package without OpenGL!")
endif()
add_subdirectory ("OpenGLPrj")
cmake_minimum_required (VERSION 3.8)
# 将源代码添加到此项目的可执行文件。
add_executable (main main.cpp glad.c)
target_link_libraries(main PRIVATE opengl32 /*glew32*/ glfw3)
// OPENGL 基本库
#include <glad/glad.h>
#include <GLFW/glfw3.h>
// 报告错误使用
#include <iostream>
// 窗口回调函数,每当敞口大小属性修改时该函数被回调,参数为该窗口的新大小
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
// 事件检查函数
void processInput(GLFWwindow* window);
int main()
{
glfwInit(); //初始化 glfw 窗口
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); // 指定 OpenGL 主版本号
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // 指定 OpenGL 子版本号
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 设置使用 OpenGL 的核心模式(可编程渲染管道)
// 创建窗口 width, height, winName, 窗口附加, 窗口依赖
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl; // 报错信息
glfwTerminate(); // 终止窗口进程
return -1;
}
glfwMakeContextCurrent(window); // 将窗口的上下问环境设置为当前主线程的上下问环境
// 初始化GLAD
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD!" << std::endl; // 报错信息
return -1;
}
// 注册窗口回调函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// 渲染循环
while (!glfwWindowShouldClose(window))
{
// 检测是否需要退出窗口
processInput(window);
// 渲染指令
// 设置清除颜色 -- 状态设置
glClearColor(0.2f, 0.3f, 0.4f, 1.0f);
// 开始清空屏幕并且使用上面的颜色
glClear(GL_COLOR_BUFFER_BIT);
// 交换颜色缓冲区
glfwSwapBuffers(window);
// 检查是否触法相关事件
glfwPollEvents();
}
// 删除/释放资源
glfwTerminate();
return 0;
}
// 窗口大小变换监听
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
// 输入监听
void processInput(GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
GLFW 和 GLAD 库,分别使用 glfwInit()
和 gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)
初始化