OpenGL学习笔记【2】——开发环境配置(GLFW,VS,Cmake),创建第一个项目

news2024/11/24 8:43:59

      学OpenGL的都会知道,OpenGL只提供了绘图功能,创建窗口是需要自己完成的。这就需要学习相应操作系统的创建窗口方法,为简化创建窗口的过程,可以使用专门的窗口库,例如GLFW。使用GLFW之前需要先进行配置,那怎么配置呢?本文将会介绍配置方法。

一、GLFW简介   

         GLFW是配合 OpenGL 使用的轻量级工具程序库,缩写自 Graphics Library Framework(图形库框架)。GLFW 的主要功能创建并管理窗口和 OpenGL 上下文,同时还提供了处理手柄、键盘、鼠标输入的功能

      GLFW是用C语言编写的,GLEW 是对底层 OpenGL 的接口的封装,可以让开发者的代码跨平台,支持Windows,macOS,X11和Wayland。

二、GLFW的配置步骤

2.1、第一步:下载GLFW源码包(source package)

        GLFW已经提供为Visual Studio(2012到2022都有)预编译好的二进制版本和相应的头文件,但是一般不建议下载预编译好的二进制文件,因为在不同的电脑上面可能会无法运行,最好还是自己下载源码进行编译,从源代码编译可以保证生成的库完全适合你的操作系统和CPU。

源代码包的下载网址:https://www.glfw.org/download.html。

当前文档使用的GLFW版本是(3.3.9

  下载GLFW源码包之后,将其解压并打开

  

     

 2.2、第二步:安装Visual Studio 

     当前文档使用的VS版本是Visual Studio 2022 ,由于学习用,下载个人开发版(Community)就行:

 下载完毕,打开Visual Studio Installer 勾选以下安装项

 

 点击单个组件检查一下,以下组件最好不要忘记勾选

2.3、第三步:安装构建工具-CMAKE

      CMake是一个开源的跨平台构建系统,是一个工程文件生成工具,它使开发人员能够以与编程语言无关的方式管理构建进程。它生成各种平台的构建文件,包括Windows、Linux、macOS和Unix。它用于自动化从源代码创建可执行文件、库和其他软件构件的过程。

     CMake使用一个名为CMakeLists.txt的配置文件来定义项目的源文件、依赖项和构建目标。 用户可以使用预定义好的CMake脚本,根据自己的选择(Visual Studio, Eclipse等)生成不同IDE的工程文件。

     CMAKE的安装教程:Windows平台CMake的安装-CSDN博客

2.4、第四步:启动CMake,进行配置,并生成工程文件

    

       2.4.1、启动Cmake后可以看到 CMake需要选择两个目录

      (1)源代码目录:就是我们第一步下载解压的GLFW的源代码的根目录                                                 (D:/openGlLearn/glfw-3.3.9);

      (2)目标文件目录:存放编译结果的,新建build 文件夹,选中作为目标目录

    2.4.2、点击Configure(设置)按钮,让CMake读取设置和源代码

    在设置完源代码目录和目标目录之后,点击Configure后会打开如下界面: 

   (1)需要选择工程的生成器:VS2022(Visual Studio 2022的内部版本号是17)

   (2)可选的编译选项用来配置最终生成的库,我们使用默认设置;

 

 选择好之后,点击finish,结果如下

  2.4.3、点击Generate(生成)按钮,生成GLFW的项目文件

 生成的工程文件会在上面2.4.1步骤里创建的build文件夹中

 2.5、第五步:编译生成GLFW库文件

   找到上面2.4.3步骤里build文件夹中生成的GLFW的项目文件,找到GLFW.sln文件,用Visual Studio 2022打开:

打开工程文件后,点击生成解决方案编译出库文件

在build/src/Debug文件夹内就会出现我们编译出的GLFW的库文件glfw3.lib

2.6、第六步:把OpenGL用到的GLFW文件放在指定文件夹

      在使用GLFW库时,为了让集成开发环境IDE比如VS知道GLFW的(库和头文件)的位置,通常需要创建IncludeLibs这两个文件夹来存放OpenGL工程用到的所有头文件和第三方库,这样所有第三方库都在同一个位置(并且可以共享至多台电脑)。

  2.6.1、创建IncludeLibs这两个文件夹

    本文档中,我们是在GLFW的源代码的根目录的同级目录下创建的

   

2.6.2、复制GLFW源码包中的头文件到新建的Include文件夹中

 (1)找到GLFW的头文件复制一下

  (2)放入新建的Include文件夹

2.6.3、复制2.5步骤中编译生成的GLFW的库文件到新建的Libs文件夹中

    (1)找到GLFW的库文件复制一下

     (2)放入新建的Libs文件下

完成以上步骤后,我们就可以使用GLFW创建我们的第一个OpenGL工程了。

三、GLFW的配置完成后,创建我们的第一个工程

 3.1、打开Visual Studio,创建一个新的项目

   选择Visual C++,然后选择Empty Project(空项目)(别忘了给你的项目起一个合适的名字)

  

 

  

 3.2、GLFW库链接(引入)进工程

    为什么要进行链接?  

     我们创建的这个项目需要用到GLFW库,只有链接了你要使用的第三方库,才能够使用,所以需要把GLFW库链接(Link)进工程但是由于我们在2.6步骤中将第三方库放在了创建的IncludeLibs文件目录中,此时我们的项目还不知道在哪寻找这个文件,所以在链接引入库文件之前,首先需要VS可以找到所需的所有文件.

 3.2.1、 VS能够找到所需的GLFW文件需进行的配置

    如果想要VS能够找到所需的GLFW文件,我们需要将2.6步骤中的IncludeLibs文件目录指定到包含目录和库目录中。

 (1)右击我们新创建的额项目,点击属性

  

(2)将FGLFW的头文件夹指定到包含目录

  

(3)将GLFW的库文件夹指定到库目录

经过3.2.1的操作,现在VS可以找到所需的所有文件了

  需要注意:每次新建一个工程时都需要告诉IDE/编译器在哪能找到这些目录

3.2.2、开始链接(引入)GLFW库到我们创建的项目中

   要链接一个库,我们必须告诉链接器它的文件名,GLFW库名字是glfw3.lib
   选择链接器的输入选项卡,点击附加依赖项右边的向下箭头,点击编辑

  

这样GLFW库在我们创建的这个项目编译的时候就会被链接进来了。

 3.3、OpenGL库链接(引入)进工程

  除了GLFW库链接进项目之外,还需要把OpenGL库链接进项目,但是这个库可能因为系统的不同而有一些差别。

     我目前使用的是windows平台,由于用的是VS编译器,opengl32.lib已经包含在Microsoft SDK里了,它在Visual Studio安装的时候就默认安装了,我们只需将opengl32.lib添加进链接器设置里就行了。

此时GLFW库以及OPENGL库就链接完毕了,GLFW的安装与配置就到此为止。

 你以为这样就完啦,不,我们仍然还有一件事要做。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法因平台而异,在Windows上会是类似这样:

 

    你可以看到代码非常复杂,而且很繁琐,我们需要对每个可能使用的函数都要重复这个过程。幸运的是,有些库能简化此过程,其中GLAD是目前最新,也是最流行的库 。

 下一章节:我们学习将如何配置GLAD

 上一章节:OpenGL学习笔记【1】——简介-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQLiteC/C++接口详细介绍sqlite3_stmt类(四)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(三) 下一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(五) 7. sqlite3_bind_parameter_count函数 sqlite3_bind_param…

章节10实验--Ubuntu18.04 Qt MySQL libqsqlmysql.so

前言: 内容参考《操作系统实践-基于Linux应用与内核编程》一书的示例代码和教材内容,所做的读书笔记。本文记录再这里按照书中示例做一遍代码编程实践加深对操作系统的理解。 引用: 《操作系统实践-基于Linux应用与内核编程》 作者:房胜、李旭健、黄…

软考高级:结构化需求分析概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

通过jsDelivr实现Github的图床CDN加速

最近小伙伴们是否发现访问我的个人博客http://xiejava.ishareread.com/图片显示特别快了? 我的博客的图片是放在github上的,众所周知的原因,github访问不是很快,尤其是hexo博客用github做图床经常图片刷不出来。一直想换图床&…

构建一个前端智能停车可视化系统

引言 随着城市化进程的加速,停车难问题日益突出。智能停车可视化系统通过实时展示停车场的车位信息,帮助用户快速找到空闲车位,提高停车效率。 目录 引言 一、系统设计 二、代码实现 1. 环境准备 2. 安装依赖 3. 创建停车场组件 4. 集…

时序预测 | Matlab实现BiTCN-BiLSTM双向时间卷积神经网络结合双向长短期记忆神经网络时间序列预测

时序预测 | Matlab实现BiTCN-BiLSTM双向时间卷积神经网络结合双向长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现BiTCN-BiLSTM双向时间卷积神经网络结合双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现BiTCN…

本地主机连接Linux虚拟机中的mongodb,并使用studio 3T连接,同时项目启动连接mongodb刷新数据库

本部分只做个人纪录 ** 1.安装mongodb ** 本部分为尚硅谷的电影推荐系统的文档,具体以实际存放位置为准 // 通过WGET下载Linux版本的MongoDB [bigdatalinux ~]$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.3.tgz// 将压缩包解压到…

Python 深度学习第二版(GPT 重译)(二)

四、入门神经网络:分类和回归 本章涵盖 您的第一个真实世界机器学习工作流示例 处理矢量数据上的分类问题 处理矢量数据上的连续回归问题 本章旨在帮助您开始使用神经网络解决实际问题。您将巩固从第二章和第三章中获得的知识,并将所学应用于三个新…

Java newInstance方法学习

用newInstance与用new是有区别的,区别在于创建对象的方式不一样,前者是使用类加载机制; newInstance方法要求该 Class 对应类有无参构造方法; 执行 newInstance()方法实际上就是使用对应类的无参构造方法来创建该类的实例&#x…

Golang 异步(bsd/linux)io

Golang 异步(bsd/linux)io 在日常开发中,读写文件的底层调用函数是syscall.Read/Write。一切都是围绕这两个函数展开的,不过有时候需要或者就是单纯想异步执行。liburing是linux上一个很好的原生异步io库,这里需要适配bsd派系的系统&#xf…

Redis面试题以及答案

1. 什么是Redis?它主要用来什么的? Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并…

00. 认识 Java 语言与安装教程

认识 Java Java 在 20 多年发展过程中,与时俱进,为了适应时代的需要,经历过两次重大的版本升级,一个是 Java 5,它提供了泛型等重要的功能。另一个是提供了 Lambda 表达式等重要的功能的 Java 8。 一些重要的 Java 的…

GitHub配置SSH Key(详细版本)

GitHub配置SSH Key的目的是为了帮助我们在通过git提交代码是,不需要繁琐的验证过程,简化操作流程。比如新建的仓库可以下载, 但是提交需要账号密码。 步骤 一、设置git的user name和email 如果你是第一次使用,或者还没有配置过的话需要操作…

linux内核input子系统概述

目录 一、input子系统二、关键数据结构和api2.1 数据结构2.1.1 input_dev2.1.2 input_handler2.1.3 input_event2.1.4 input_handle 2.2 api接口2.2.1 input_device 相关接口input_device 注册流程事件上报 2.2.2 input handle 相关接口注册 handle指定 handle 2.2.3 input han…

Python 深度学习第二版(GPT 重译)(一)

前言 序言 如果你拿起这本书,你可能已经意识到深度学习在最近对人工智能领域所代表的非凡进步。我们从几乎无法使用的计算机视觉和自然语言处理发展到了在你每天使用的产品中大规模部署的高性能系统。这一突然进步的后果几乎影响到了每一个行业。我们已经将深度学…

Java与Go:指针

在计算机内存中,每个变量都有一个唯一的地址,指针就是用来保存这个地址的变量。通过指针,我们可以间接地访问和修改存储在该地址处的数据。今天我们来聊一聊Java和Go指针,预告一下,我们需要借助C语言做一些小小的比较。…

Jmeter Ultimate Thread Group 和 Stepping Thread Group

线程组:使用复杂场景的性能测试 有时候我们做性能测试时,只依靠自带的线程组,显示满足不了性能测试中比较复杂的场景,下面这两种线程组可以帮助你很好的完成复杂的场景 第一种:Stepping Thread Group 在取样器错误后…

详解ThreadLocal

为什么出现ThreadLocal ? 在多线程环境下,如果多个线程同时修改一个公共变量,可能会出现线程安全问题,即该变量的最终结果可能出现异常。为了解决线程安全问题,JDK提供了很多技术手段,比如使用synchronize…

软考高级:软件架构风格-虚拟机风格概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

练习 10 Web [MRCTF2020]你传你呢

和test5一样,文件上传限制为图片,使用.htaccess文件让上传成功图片木马文件进行执行 开屏暴击,差点去世 尝试上传文件 各种过滤,但是能传图片,这里就不写了,我做过的test5遇到过的重复内容 直接尝试在te…