当前位置: 首页 > article >正文

OpenGL入门001——使用glad和glfw创建一个窗口

文章目录

  • glfw
  • glad
  • 创建窗口进行渲染的基本流程
    • 目的
    • main.cpp
    • CMakeLists.txt

glfw

概述: 用于OpenGL开发中创建窗口、上下文和处理输入等操作。提供跨平台支持,简化了底层的操作系统调用

作用:

  • 窗口和上下文管理:
    • 创建窗口:GLFW提供API创建OpenGL窗口,并设置窗口大小、标题、位置等,窗口是渲染图像的主要界面
    • OpenGL上下文:每个窗口都有独立的OpenGL上下文,用于管理OpenGL的状态和资源。GLFW自动为窗口创建上下文,简化开发流程
    • 双缓冲:GFLW支持双缓冲,用于减少图形闪烁问题,在双缓冲模式下,渲染的图像会在后台缓冲区绘制,完成后交换到前台缓冲区,实现平滑显示
  • 输入处理:
    • 键盘输入:GLFW提供API监听键盘事件,包括按键按下、释放等,开发者可以查询某个按键的状态,或使用回调函数处理键盘输入
    • 鼠标输入:GLFW还提供鼠标位置、滚轮和按键事件的处理。
    • 手柄/控制器支持:GLFW支持游戏手柄,适用于需要控制器输入的应用
  • 事件管理:
    • 窗口事件:GLFW可以监听窗口的事件,包括窗口大小改变、窗口关闭等事件。开发者可以注册相应的回调函数,方便实现窗口重绘或调整界面元素
    • 刷新帧:GLFW提供了帧刷新功能,让开发者在双缓冲模式下完成每帧的渲染后,将图像从后台缓冲区切换到前台

glad

概述: 是一个用于管理OpenGL函数指针的库,由于OpenGL是一个跨平台的图形API,不同平台上的OpenGL实现可能会有所不同,因此需要一个工具来加载和管理这些函数指针。

作用:

  • 加载OpenGL函数指针:OpenGL函数在运行时由驱动程序提供,GLAD负责加载这些函数指针,使得程序可以调用OpenGL函数
  • 跨平台支持:glad支持多种平台和opengl版本,简化了跨平台开发的复杂性

创建窗口进行渲染的基本流程

目的

利用glfw和glad进行窗口的创建,然后循环渲染。

怎么在vscode上使用cmake构建项目,具体可以看这篇Windows上如何使用CMake构建项目 - 凌云行者的博客

main.cpp

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

using std::cout;
using std::endl;

// 屏幕宽度
const unsigned int SCR_WIDTH = 800;
// 屏幕高度
const unsigned int SCR_HEIGHT = 600;

// 窗口大小改变的回调函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
    // 确保视口与新窗口尺寸匹配,注意在视网膜显示器上,宽度和高度会显著大于指定值
    glViewport(0, 0, width, height);
}

// 处理输入
void process_input(GLFWwindow* window) {
    // 按下ESC键时进入if块
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        // 关闭窗口
        glfwSetWindowShouldClose(window, true);
}

int main() {
    // 初始化glfw
    glfwInit();
    // 设置opengl版本
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    // 使用核心模式:确保不使用任何被弃用的功能
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	
    // 创建glfw窗口
    GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "I am window title", NULL, NULL);
    if (window == NULL) {
        cout << "Failed to create glfw window" << endl;
        // 终止GLFW
        glfwTerminate();
        return -1;
    }
    // 设置当前窗口的上下文
    glfwMakeContextCurrent(window);
    // 设置窗口大小改变的回调函数
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
    
    // 加载opengl函数指针
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
        cout << "Failed to initialize GLAD" << endl;
        return -1;
    }
    
    // 循环渲染
    while (!glfwWindowShouldClose(window)) { // 检查是否应该关闭窗口
        // 处理输入
        process_input(window);
        
        // 清空屏幕所用的颜色
        glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
        // 清空颜色缓冲,主要目的是为每一帧的渲染准备一个干净的画布
        glClear(GL_COLOR_BUFFER_BIT);
        
        // 交换缓冲区
        glfwSwapBuffers(window);
        // 处理所有待处理事件,去poll所有事件,看看哪个没处理的
        glfwPollEvents();
    }
    
    // 终止GLFW,清理GLFW分配的资源
    glfwTerminate();
    return 0;
}

CMakeLists.txt

# 设置CMake的最低版本要求
cmake_minimum_required(VERSION 3.10)
# 设置项目名称
project(HelloWorld)

# vcpkg集成, 这里要换成你自己的vcpkg工具链文件和共享库路径
set(VCPKG_ROOT D:/software6/vcpkg/)
set(CMAKE_TOOLCHAIN_FILE ${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake)
set(CMAKE_PREFIX_PATH ${VCPKG_ROOT}/installed/x64-mingw-static/share)

# 查找所需的包
find_package(glad CONFIG REQUIRED)
find_package(glfw3 CONFIG REQUIRED)

# 添加可执行文件
add_executable(HelloWorld main.cpp)

# 链接所需的库
target_link_libraries(HelloWorld PRIVATE glad::glad glfw)

http://www.kler.cn/a/373598.html

相关文章:

  • 【Linux系统】—— vim 的使用
  • nginx负载均衡-基于端口的负载均衡(一)
  • 前端练习题
  • 【微服务】面试 7、幂等性
  • SpringCloud系列教程:微服务的未来(十二)OpenFeign连接池、最佳实践、日志、微服务拆分
  • unity 播放 序列帧图片 动画
  • 为什么 C 语言数组是从 0 开始计数的?
  • Cursor的composer和chat的应用
  • 荣耀独立四周年:以己之名,终至海阔天空
  • 串口通信以及USART和UART以及IIC和SPI-学习笔记
  • Java 开发——(下篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus
  • C# .NET最小API?
  • 【利器】12个评估大语言模型(LLM)质量的自动化框架
  • GAME JAM:加入我们的甜蜜幽灵冒险之旅
  • Centos安装ffmpeg的方法
  • Electron调用nodejs的cpp .node扩展【非安全】
  • 「图文详解」Pycharm 远程服务器Debug
  • 【SSM-Day5】SpringMVC入门
  • Redis新数据类型
  • 基于vue框架的的驾校预约车辆管理系统设计与实现jwoqj(程序+源码+数据库+调试部署+开发环境)系统界面在最后面
  • [瑞吉外卖]-10前后端分离
  • Vue3学习:vue组件中的图片路径问题
  • 字符函数和字符串函数(C 语言)
  • 微服务电商平台课程二:技术图谱
  • AI产品独立开发变现实战营,炒掉老板做自由职业赚大钱
  • 【vue 全家桶】1、vue 基础