OpenGL 环境搭建和 hello world 程序(LearnOpenGL P1)

news2024/11/26 20:23:16

文章目录

    • OpenGL
    • GLFW & CMake
    • 链接到 Hello OpenGL!
    • GLAD
    • 运行测试

OpenGL

什么是 OpenGL,OpenGL 能做什么在此不再赘述

运行 OpenGL 需要准备的有:

  • CMake:用于执行编译
  • VS:我使用的是 Visual Studio 17 2022 版本
  • GLFW:C语言库,用 VS 2022 编译、链接
  • GLAD:OpenGL 的驱动层,同样需要和 VS 编译链接

GLFW & CMake

从 https://www.glfw.org/download.html 下载 GLFW 的源码
在这里插入图片描述

CMake 需要绑定一个 c语言 编译器,这里选择你安装的 VS 版本即可
在这里插入图片描述
然后解压 glfw 源码到一个文件夹
在这里插入图片描述
在 CMake 中选择 glfw 的源码地址和构建输出目标地址

在这里插入图片描述
在下面点击 Configure 和 Generate,就可以编译出 sln 工程了
在这里插入图片描述
随后使用 VS 2022 打开 GLFW.sln,生成解决方案,构建即可~

  1. 构建结束后在这个路径找到 glfw3.lib,这就是我们要的 GLFW 库文件了

在这里插入图片描述

  1. 回到 glfw 源代码文件夹,这里有个 include 文件夹,也是我们需要关注的文件

在这里插入图片描述
为了方便我们的 OpenGL 项目使用,我们找个地方创建一个文件夹,把东西放进去,include 直接复制到文件夹里,再创建一个 lib 文件夹把刚刚的 glfw3.lib 放进去~
在这里插入图片描述

链接到 Hello OpenGL!

右键点击我们的项目名称(在解决方案下面)打开属性
在这里插入图片描述
在这里插入图片描述
在这里添加:

  • 包含目录(对应 include)
  • 库目录(对应 lib)

在这里插入图片描述
在这里加上 glfw3.lib 和 opengl32.lib,别把分号忘记掉了
在这里插入图片描述

GLAD

GLAD 的开源生成页面在:https://glad.dav1d.de/

选好这两项,在下面点击生成即可
在这里插入图片描述
这就是结果源码,下载下来,把 include 导入即可
在这里插入图片描述

需要注意的是,src 不是库,把里面的 glad.c 放在项目里面就可以了
在这里插入图片描述

运行测试

然后创建一个 cpp 文件到源文件分类中,导入这两行,没问题就成功了~
在这里插入图片描述
实现了base.h & base.cpp,把 OpenGL 的一部分数据解耦出去了,main.cpp 负责调用运行
在这里插入图片描述

#include "base.h"

/// <summary>
/// 初始化 glfw 并配置参数
/// </summary>
void initGlfw() {
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
}

/// <summary>
/// 创建窗口对象, 存放了窗口相关数据
/// </summary>
/// <returns></returns>
GLFWwindow* createWindowObj() {

    // todo
    GLFWwindow* window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_LABEL, NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return (GLFWwindow*)-1;
    }
    glfwMakeContextCurrent(window);
    return window;
}

int initGlad() {
    // todo -> glfwGetProcAddress
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }
    return 1;
}

void initViewport(GLFWwindow* window) {
    glViewport(0, 0, 800, 600);
    glfwSetFramebufferSizeCallback(window, [](GLFWwindow* window, int width, int height) {
        glViewport(0, 0, width, height);
        });
}

void mainThread(GLFWwindow* window) {
    while (!glfwWindowShouldClose(window))
    {
        // 检测输入
        [](GLFWwindow* window)
        {
            if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
                glfwSetWindowShouldClose(window, true);
        };

        // 渲染指令
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        // 检查并调用事件, 交换缓冲
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwTerminate();
}

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

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

相关文章

系统架构师备考倒计时13天(每日知识点)

1. 数据仓库四大特点 面向主题的。操作型数据库的数据组织面向事务处理任务&#xff0c;各个业务系统之间各自分离&#xff0c;而数据仓库中的数据是按照一定的主题域进行组织的。集成的。数据仓库中的数据是在对原有分散的数据库数据抽取、清理的基础上经过系统加工、汇总和整…

[ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹

本文收录于【#云计算入门与实践 - AWS】专栏中&#xff0c;收录 AWS 入门与实践相关博文。 本文同步于个人公众号&#xff1a;【云计算洞察】 更多关于云计算技术内容敬请关注&#xff1a;CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文&#xff1a; [ 云计算 | …

100 # mongoose 的使用

mongoose elegant mongodb object modeling for node.js https://mongoosejs.com/ 安装 mongoose npm i mongoose基本示例 const mongoose require("mongoose");// 1、连接 mongodb let conn mongoose.createConnection("mongodb://kaimo313:kaimo313loc…

python算法

第一章 算法 一系列解决单个或多个问题&#xff0c;或有执行计算机功能的命令集合。人类在解决复杂问题时所采用的一系列特定的方法&#xff0c;即为算法。 算法与程序的区别 程序指一组计算机能识别和执行&#xff0c;并有一定功能的指令。程序是以计算机能理解的各式各样的…

CCF CSP认证 历年题目自练Day37

题目一 试题编号&#xff1a; 201312-3 试题名称&#xff1a; 最大的矩形 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   在横轴上放了n个相邻的矩形&#xff0c;每个矩形的宽度是1&#xff0c;而第i&#xff08;1 ≤ i ≤ n&a…

SLAM ORB-SLAM2(6)系统对象

SLAM ORB-SLAM2(6)系统对象 1. 封装2. 成员变量2.1. 核心数据2.2. 三个对象2.3. 三个线程2.4. 跟踪状态3. 成员函数4. 构造函数5. 数据驱动接口1. 封装 在 《SLAM ORB-SLAM2(5)例程了解》 了解到创建了一个 ORB_SLAM2::System 类型的对象 然后不断的把数据供给该对象就可以…

图论02-【无权无向】-图的深度优先遍历DFS

文章目录 1. 代码仓库2. 深度优先遍历图解3. 主要代码3.1 dfs递归的主要代码 - 先序遍历和后序遍历3.2 dfs非递归的主要代码 - 使用栈3.3 递归与非递归遍历出来的顺序不一致3.4 标记不同的联通分量 4. 完整代码4.1 CC.java4.2 Graph.java 1. 代码仓库 https://github.com/Chufe…

【计算机网络】TCP 协议的相关特性

TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的协议。以下是TCP协议的相关特性&#xff1a; 可靠性&#xff1a;TCP通过确认和重传机制保证数据的可靠传输。 面向连接&#xff1a;TCP在传输数据前需要先建立连接。连接的建立过程包括三次握手…

03、Python 字符串高级用法

目录 Python 字符串高级用法转义字符字符串格式化序列相关的方法大小写相关的方法dir 可以查看某个类的所有方法删除空白查找、替换相关方法 Python 字符串高级用法 转义字符 字符串格式化 序列相关的方法 字符串本质就是由多个字符组成&#xff0c;字符串的本质就是不可变序…

Metabase:简单快捷的商业智能与数据分析工具 | 开源日报 No.61

moby/moby Stars: 66.8k License: Apache-2.0 Moby 是一个由 Docker 创建的开源项目&#xff0c;旨在实现和加速软件容器化。它提供了工具包组件的“乐高集”&#xff0c;可以将它们组装成基于容器的自定义系统的框架。组件包括容器生成工具、容器注册表、业务流程工具、运行时…

字节码进阶之javassist字节码操作类库详解

字节码进阶之javassist字节码操作类库详解 文章目录 前言使用教程添加Javassist依赖库创建和修改类方法拦截创建新的方法 进阶用法创建新的注解创建新的接口创建新的构造器生成动态代理修改方法示例2 前言 Javassist&#xff08;Java programming assistant&#xff09;是一个…

C#实现数据导出任一Word图表的通用呈现方法及一些体会

疲惫的修改 应人才测评产品的需求&#xff0c;导出测评报告是其中一个重要的环节&#xff0c;报告的文件类型也多种多样&#xff0c;其中WORD输出也扮演了一个重要的角色。 实现方法比较简单&#xff0c;结合分析结果数据&#xff0c;通过WORD模板文件进行替换输出。在实现的…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第二章 线程同步精要

并发编程有两种基本模型&#xff0c;一种是message passing&#xff0c;另一种是shared memory。在分布式系统中&#xff0c;运行在多台机器上的多个进程的并行编程只有一种实用模型&#xff1a;message passing。在单机上&#xff0c;我们也可以照搬message passing作为多个进…

【JavaEE】初识计算机网络(TCP/IP五层模型及封装和分用)

一、 网络通信基础 网络互连的目的是进行网络通信&#xff0c;也即是网络数据传输&#xff0c;更具体一点&#xff0c;是网络主机中的不同进程间&#xff0c;基于网络传输数据。 那么&#xff0c;在组建的网络中&#xff0c;如何判断到底是从哪台主机&#xff0c;将数据传输到…

仿CSGO盲盒开箱源码 盲盒商城源码 盲盒开箱源码 潮物盲盒商城源码

仿CSGO盲盒开箱源码 盲盒商城源码 盲盒开箱源码 潮物盲盒商城源码 测试环境&#xff1a;宝塔、Linux、PHP7.2、MySQL5.6 根目录 public&#xff0c;伪静态 thinkphp&#xff0c;php需要Redis扩展 后台&#xff1a;/stf 账号&#xff1a;admin 密码&#xff1a;123123 *后台…

【量化交易笔记】11.移动平均交易策略

概述 上一节我们建立了最最简单的交易策略&#xff0c;尽管有了盈利&#xff0c;但实际操作上是不可行的。本节将运用移动平均指标&#xff0c;包括单一移动平均策略和双移动平均策略&#xff0c;来建立经典的移动平均策略。 数据采集处理 本文采用上一节的相同数据&#xf…

Python基础入门例程1-NP1 Hello World!

描述 将字符串 Hello World! 存储到变量str中&#xff0c;再使用print语句将其打印出来。 输入描述&#xff1a; 无 输出描述&#xff1a; 一行输出字符串Hello World! 解答&#xff1a; str "Hello World!" print(str) 解释说明&#xff1a; 赋值变量&…

AD9371 官方例程HDL详解之JESD204B TX_CLK生成 (二)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

[H5动画制作系列]雪花随机产生飘落

雪花图片参考: 全局代码: var max120; var index0; 第一帧代码: index; if(index<max){posX550*Math.random();posY220*Math.random()-100;scale0.8*Math.random()0.2;var snowflakenew lib.snowlink();snowflake.xposX;snowflake.yposY;snowflake.scaleXscale;snowflake…

SpringBoot 实体参数(用于请求参数比较多时使用)

字段必须和传参时一致&#xff0c;否则为null&#xff0c; 使用AITINS可以快速生成&#xff0c;SET GET方法 public class User {//字段必须和传参时一致&#xff0c;否则为nullprivate String user;private String password;public String getUser() {return user;}public vo…