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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/905203.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习基础】激活函数

激活函数 1. Sigmoid函数2. Tanh&#xff08;双曲正切&#xff09;函数3. ReLU函数4. Leaky ReLU函数 1. Sigmoid函数 观察导数图像在我们深度学习里面&#xff0c;导数是为了求参数W和B&#xff0c;W和B是在我们模型model确定之后&#xff0c;找出一组最优的W和B&#xff0c;使…

leetcode-62-不同路径

题解&#xff1a; 1、设dp[i][j]代表到达(i,j)点最多的路径&#xff1b;题目要求机器人每次只能向右或向下走一步&#xff0c;所以到达(i,j)点的最多路径为到达(i-1,j)的最多路径与到达(i,j-1)的最多路径之和。即dp[i][j]dp[i-1][j]dp[i][j-1]。 2、初始化一个M*N的矩阵dp,将…

C++在实际项目中的应用第三节:C++与数据科学

第五章&#xff1a;C在实际项目中的应用 第三节&#xff1a;C与数据科学 1. C在数据分析中的实际应用 数据分析是数据科学的核心部分&#xff0c;主要涉及数据的清洗、转换和建模。C作为一种高性能的编程语言&#xff0c;越来越多地被应用于数据分析领域。以下是 C 在数据分…

Git上传文件至AtomGit

目录 一、GIt大文件存储 Git LFS 二、Git LFS的使用 1.初始化 2.将大型文件放进LFS管理 三、整体流程 首先&#xff0c;你已经创建属于你自己的本地库了。以下一大型文件上传为基础&#xff0c;50mb的文件可以直接上传至 AtomGit上面&#xff0c;不需要多讲。 一、GIt大文…

北京迅为iTOP-LS2K0500开发板快速使用编译环境虚拟机Ubuntu基础操作及设置

迅为iTOP-LS2K0500开发板 迅为iTOP-LS2K0500开发板采用龙芯LS2K0500处理器&#xff0c;基于龙芯自主指令系统&#xff08;LoongArch&#xff09;架构&#xff0c;片内集成64位LA264处理器核、32位DDR3控制器、2D GPU、DVO显示接口、两路PClE2.0、两路SATA2.0、四路USB2.0、一路…

ArcGIS005:ArcMap常用操作101-150例动图演示

摘要&#xff1a;本文涵盖了GIS软件操作的多方面内容&#xff0c;包括地图文档的新建、打开、保存及版本兼容性处理&#xff1b;错误与警告的查阅及帮助文档的使用技巧&#xff1b;地图打印比例尺的调整与地图信息的完善&#xff1b;图层操作的撤销与恢复&#xff0c;界面元素的…

设计模式基础概念(行为模式):责任链模式(Chain Of Responsibility)

概述 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 该模式建议你将这些处理者连成一条链。 链上的每个处理者都有一个成员变量来保存对于…

丝氨酸/苏氨酸激酶(STKs):前列腺癌治疗的新兴靶点

引言 前列腺癌&#xff08;PCa&#xff09;是男性癌症相关死亡的第五大原因&#xff0c;全球约有140万患者&#xff0c;2020年超37.5万死亡病例。 靶向治疗是潜力巨大的领域&#xff0c;PARP、PSMA、STEAP1、DLL3等是前列腺癌治疗的明星靶点。 除此之外&#xff0c;还有哪些…

目录遍历漏洞

目录遍历 目录 概念漏洞分析 加密型传递参数编码绕过目录限定绕过绕过文件后缀过滤(截断上传原理) 漏洞挖掘 访问图片文件测试时去掉文件名只访问目录路径搜索引擎谷歌关键字 pikachu目录遍历 目录遍历与任意文件下载其实差不多,但是如果目录遍历比如etc/passwd只能看不能下…

autMan奥特曼机器人-内置Redis

autMan内置了redis服务&#xff0c;有的脚本运行需要redis支持 几个注意事项&#xff1a; 启用redis服务后要重启autMan生效&#xff0c;关闭一样的道理。启用redis服务后会增加约200M的内存占用多个autMan的redis服务可以组成集群redis服务

如何打造真正吸引人的谷歌网站内容?

谷歌的算法一直以来都被视为一个神秘的“黑盒子”&#xff0c;它通过无数的信号来判断每一个网站的质量和相关性。但事实上&#xff0c;谷歌的许多算法原理和规则都是有迹可循的&#xff0c;比如E-A-T&#xff08;专业性、权威性、可信度&#xff09;就是谷歌判断内容质量的核心…

力扣之612.平面上的最近距离

文章目录 1. 612.平面上的最近距离1.1 题目说明1.2 准备数据1.3 解法1.4 结果截图 1. 612.平面上的最近距离 1.1 题目说明 Point2D 表&#xff1a; ----------------- | Column Name | Type | ----------------- | x | int | | y | int | ----------------- (x, y) 是该表的…

混凝土裂缝图像分割系统:快速图像识别

混凝土裂缝图像分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-RFAConv&#xff06;yolov8-seg-C2f-SCConv等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Glo…

echart实现地图数据可视化

文章目录 [TOC](文章目录) 前言一、基本地图展示2.数据可视化 总结 前言 最近工作安排使用echarts来制作图形报表&#xff0c;记录一下我的步骤&#xff0c;需求呈现一个地图&#xff0c;地图显示标签&#xff0c;根据业务指标值给地图不同省市填充不同颜色&#xff0c;鼠标放…

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误 测试环境1、 MYODBC 3.51.18 or higher2、分析和解决2.1 解决1&#xff0c;降级MySQL ODBC2.2 解决2&#xff0c;修改FreeSWITCH代码 测试环境 http://myfs.f3322.net:8020/ 用户名&#xff1a;admin&#xff0c;密…

VSM(价值流图)如何应用于新的生产流程设计?

VSM&#xff08;价值流图&#xff09;如何应用于新的生产流程设计&#xff0c;是当代制造业中提升效率、降低成本和增强竞争力的关键课题。VSM作为一种源自丰田生产模式的精益生产工具&#xff0c;其核心在于通过可视化分析&#xff0c;识别并消除生产过程中的浪费&#xff0c;…

openGauss开源数据库实战十二

文章目录 任务十二 openGauss逻辑结构:表管理任务目标实施步骤一、准备工作二、创建表1.新建表默认保存在public模式中2.在一个数据库的不同模式下创建表3.创建表的时候定义约束4.创建表时使用自增数据类型5.使用现有的表创建新表 三、查看表的信息1.在gsql中查看表的定义2.查看…

SQL Server 可观测最佳实践

SQL Server 简介 SQL Server 是微软公司开发的一款关系数据库管理系统&#xff0c;支持企业 IT 环境中的各种事务处理、商业智能和分析应用程序。它支持多种操作系统平台&#xff0c;而无论是物理还是虚拟形式&#xff0c;自建部署环境还是在云环境中&#xff0c;运行的操作系…

vite构建Vue3项目:封装公共组件,发布npm包,自定义组件库

文章目录 前言一、创建基础的vite 脚手架二、文件结构三、编写组件代码,本地测试四、配置项五、打包npm发布六、npm下载使用总结 前言 使用vue开发组件封装是一个很普遍的事情了&#xff0c;封装好一个组件可以在项目的任意地方去使用&#xff0c;我们还可以从npm仓库下载别人…

[OPEN SQL] FOR ALL ENTRIES IN

FOR ALL ENTRIES IN 语句用于从一个内部表中检索与另一个内部表中指定字段匹配的记录 语法格式 SELECT ... FOR ALL ENTRIES IN <itab> WHERE <cond>. <itab>&#xff1a;插入目标数据内表 <cond>&#xff1a;查询条件 使用FOR ALL ENTRY IN 语句时&…