GLFW与Glad在项目中使用

196 阅读3分钟

使用GLFW创建窗体

项目配置

项目我们使用CMake进行构建的, CMakeLists.txt文件内容如下

cmake_minimum_required(VERSION 3.12)

project(OpenGL_Lecture)

set(CMAKE_CXX_STANDARD 17)

include_directories(
	SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/thirdParty/include
)

link_directories(
	SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/thirdParty/lib
)

add_executable(OpenGL_Lecture main.cpp glad.c)

target_link_libraries(OpenGL_Lecture glfw3.lib)


项目目录结构如下

image.png

GLFWglad可以参考这两个链接进行配置

使用GLFW创建窗体

#include <glad/glad.h>
// 注意:glad头文件要在glfw头文件之前引用
#include <GLFW/glfw3.h>



int main() {

    // 1 初始化GLFW基本环境
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);  // 设置OpenGL的主版本号
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);  // 设置OpenGL的次版本号
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 设置OpenGL启用核心模式(非立即渲染模式)


    // 2 创建窗体对象
    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGLLearn", nullptr, nullptr);

    glfwMakeContextCurrent(window);  // 设置当前窗体对象为OpenGL的绘制舞台



    // 3 执行窗体循环

    while (!glfwWindowShouldClose(window))
    {
        // 接收并分发窗体消息
        // 检查消息队列是否有需要处理的鼠标,键盘等消息
        // 如果有的话就将消息批量处理,清空队列
        glfwPollEvents();  
    }


    // 4 退出程序前做相关清理
    glfwTerminate(); 


    return 0;
}


运行效果

image.png

GLFW事件回调

窗体大小变化事件

我们先注册一个函数响应窗体大小变化
// 声明且实现一个响应窗体大小变化的函数
void frameBufferSizeCallBack(GLFWwindow* window, int width, int height)
{
    std::cout << "窗体最新大小" << width << "," << height << std::endl;

}

// 在创建完成窗体对象后,我们注册一个函数监听窗体变化
glfwSetFramebufferSizeCallback(window, frameBufferSizeCallBack);  // 设置监听,监听窗体大小变化
运行效果

scaleWindow.gif

键盘事件

我们注册一个键盘事件响应函数
// 声明且实现一个键盘消息回调函数
// key代表字母按键码
// scancode 代表物理按键码,就是所按的键在键盘上的物理位置,很少使用
// action 表示按下还是抬起
// mods表示是否有shift或ctrl
void keyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_W)
    {
        std::cout << "按下了GLFW_KEY_W"  << std::endl;
    }

    std::cout << "按下了:" << key << std::endl;
}

glfwSetKeyCallback(window, keyCallBack);  // 设置监听,监听键盘消息
运行效果

keyEvent.gif

使用Glad加载函数

代码

    // 使用glad加载所有当前版本OpenGL的函数

    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))  // 向gladLoadGLLoader传一个加载函数
    {
        std::cout << "Failed to init GLAD" << std::endl;

        return  -1;
    }

项目完整代码

#include <iostream>
#include <glad/glad.h>

#include <GLFW/glfw3.h>

// 声明且实现一个响应窗体大小变化的函数
void frameBufferSizeCallBack(GLFWwindow* window, int width, int height)
{
    std::cout << "窗体最新大小" << width << "," << height << std::endl;

}


// 声明且实现一个键盘消息回调函数
// key代表字母按键码
// scancode 代表物理按键码,就是所按的键在键盘上的物理位置,很少使用
// action 表示按下还是抬起
// mods表示是否有shift或ctrl
void keyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_W)
    {
        std::cout << "按下了GLFW_KEY_W"  << std::endl;
    }

    std::cout << "按下了:" << key << std::endl;
}

int main() {

    // 1 初始化GLFW基本环境
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);  // 设置OpenGL的主版本号
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);  // 设置OpenGL的次版本号
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 设置OpenGL启用核心模式(非立即渲染模式)


    // 2 创建窗体对象
    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGLLearn", nullptr, nullptr);

    glfwMakeContextCurrent(window);  // 设置当前窗体对象为OpenGL的绘制舞台

    glfwSetFramebufferSizeCallback(window, frameBufferSizeCallBack);  // 设置监听,监听窗体大小变化

    glfwSetKeyCallback(window, keyCallBack);  // 设置监听,监听键盘消息


    // 使用glad加载所有当前版本OpenGL的函数

    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))  // 向gladLoadGLLoader传一个加载函数
    {
        std::cout << "Failed to init GLAD" << std::endl;

        return  -1;
    }



    // 3 执行窗体循环

    while (!glfwWindowShouldClose(window))
    {
        // 接收并分发窗体消息
        // 检查消息队列是否有需要处理的鼠标,键盘等消息
        // 如果有的话就将消息批量处理,清空队列
        glfwPollEvents();  
    }


    // 4 退出程序前做相关清理
    glfwTerminate(); 


    return 0;
}