• 明理
    • 个人网站
    • STM32
    • SCons
    • 图形界面
    • 使用GLFW构建一个窗口
      • Environment
      • Getting Start
        • Glad
        • 主程序
    • Nuklear入门
    • CubeMX + SCons 闪灯实验
    • 手搓 Gitbook 主题
    • 在本地测试个人网站
    • 想要一个个人网站
使用GLFW构建一个窗口

使用GLFW构建一个窗口

  • Windmill-City
  • 2023-01-29
    • 图形界面

Environment

软件 版本
Windows 10 专业版 22H2 19045.2486
Visual Studio Community 2022 - 使用C++的桌面开发 17.4.4
MSVC v143
Windows 10 SDK 10.0.20348.0
CMake 3.25.2
VSCode 1.74.3
GLFW 3.3.8

Getting Start

GLFW-Getting-Start

git clone git@github.com:glfw/glfw.git

Glad

Glad: OpenGL 加载代码生成器

进入<Glad>网站生成加载代码

由于我们仅仅需要基础的 OpenGL 功能, 所以只需要选择 gl 的版本, 其它不变

Language=C/C++ Specification=OpenGL

API gl=Version 4.6 gles1=None gles2=None glsc2=None

Profile=Compatibility

Extensions=Empty

点击 Generate 生成加载代码, 下载 glad.zip

CMakeLists.txt

cmake_minimum_required(VERSION 3.18)
project(glad)

add_library(glad STATIC src/glad.c)
target_include_directories(glad PUBLIC include)

最终文件结构

glad
│  CMakeLists.txt
│
├─include
│  ├─glad
│  │      glad.h
│  └─KHR
│         khrplatform.h
└─src
        glad.c

主程序

CMakeLists.txt

cmake_minimum_required(VERSION 3.18)
project(testWnd)

# ##############################################################################
# Find Packages
# ##############################################################################

add_subdirectory(glfw EXCLUDE_FROM_ALL)
add_subdirectory(glad EXCLUDE_FROM_ALL)

# ##############################################################################
# Targets
# ##############################################################################

add_executable(testWnd src/main.cpp)
target_include_directories(testWnd PRIVATE include)
target_link_libraries(testWnd PRIVATE glfw glad)

<LearnOpenGL-窗口>

根据以上教程编写代码, 构建最基础的窗口

main.cpp

#include <cstdlib>
#include <iostream>

#include <glad/glad.h>
#include <GLFW/glfw3.h>

void framebuffer_size_callback(GLFWwindow* window, int width, int height);

int main()
{
    // GLFW Init Start
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#if defined(__APPLE__)
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
    // GLFW Init End

    // Create Window Start
    GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
    if (!window)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();

        std::exit(EXIT_FAILURE);
    }
    glfwMakeContextCurrent(window);
    // Create Window End

    // GLAD Init Start
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        std::exit(EXIT_FAILURE);
    }
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
    // GLAD Init End

    // Event Loop
    while (!glfwWindowShouldClose(window))
    {
        // Background color
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwTerminate();
    std::exit(EXIT_SUCCESS);
}

void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}

编译运行

BasicWindow

至此完成GLFW窗口构建