【OpenGL4.6】VS2022安装OpenGL4.6的全过程

news/2024/5/20 13:24:06

文章目录

  • 一、说明
  • 二、vs2022环境安装
    • 2.1. 安装vs2022
    • 2.2 为OpenGL专门建立目录
  • 三、下载安装cmake,用于编译源代码
    • 3.1 为什么安装Cmake
    • 3.2 下载和安装Cmake
  • 四、下载安装glfw,用于窗口界面
    • 4.1 设置glfw库,用于创建窗体
    • 4.2 如何使用glfw库?
  • 五、下载glad支持
    • 5.1 glad是什么?
    • 5.2 下载
  • 六、配置OpenGL项目
    • 6.1 配置步骤总览
    • 6.2 集中部署OpenGL的项目环境
    • 6.3 如何配置glad
    • 6.4 配置glfw库:
  • 7 测试代码

一、说明

我这里用python完成OpenGL的开发,目前存在一个问题是:OpenGL4.6到目前还没看到python版本。有时需要OpenGL4.6,不能再等,于是只能安装一个C++版的OpenGL4.6试用。以下为安装过程全记录。

二、vs2022环境安装

2.1. 安装vs2022

  • 1首先进入微软的visualstudio主页

https://visualstudio.microsoft.com

  • 下载一个visual studio community并运行
  • 选择安装 在这里插入图片描述
    我按自己的需要选择python、c++、c#桌面、VC++;按“继续”开始安装。
    在这里插入图片描述
    注意:第一次安装后启动,需要注册用户,建议保存注册账号,以后永远可用。

2.2 为OpenGL专门建立目录

为了提高效率,建一个VStudent作为所有VC项目的总目录,然后建立一个AboutOpenGL,在AboutOpenGL下生成VC+opengl的项目,如下:
在这里插入图片描述
此图后文中还要用到。

三、下载安装cmake,用于编译源代码

3.1 为什么安装Cmake

当然,VC++内部有Cmake,为什么要安装一个?
因为VC++内的Cmake为微软产品配套,对于OpenGL这种开源项目,就不能用微软的Cmake,而是Kitware公司的产品。
CMake使用平台无关的配置文件来控制软件编译过程,并生成可在您选择的编译器环境中使用项目文件,比如可以生成vs项目文件或者makefile。 CMake工具套件由Kitware公司创建,以满足ITK和VTK等开源项目对跨平台构建环境的需求。

3.2 下载和安装Cmake

如果用glfw源码编译就安装Cmake,如果不用源码,可以不安装Cmake。

https://cmake.org/download/

在这里插入图片描述https://github.com/Kitware/CMake/releases/download/v3.24.2/cmake-3.24.2-windows-x86_64.msi
双击msi文件,安装。

  • 要选择系统环境路径变量path。
    在这里插入图片描述
    在这里插入图片描述

四、下载安装glfw,用于窗口界面

4.1 设置glfw库,用于创建窗体

https://www.glfw.org

  • 我们选择使用编译好的二进制库:
  • 在这里插入图片描述

4.2 如何使用glfw库?

glfw不属于微软默认系统,需要手工添加到你的具体项目中。
下载的glfw-3.4.bin.WIN64.zip是一个多版本并存的包,展开以后挑选相应版本添加到你的opengl项目中:
在这里插入图片描述
解压后放到文件夹里面备用opengl32.lib和include

五、下载glad支持

5.1 glad是什么?

glad是最重要的OpenGL库,包括GL_CORE核心库的调用。我们这里下载glad是include文件,不是对全部opengl的lib的安装,因为一般的win10系统,凡是安装了Nvidia驱动,必然安装opengl32.lib,因此不必单独安装opengl32了。

5.2 下载

https://glad.dav1d.de/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
只要单击对应压缩文件就可以下载了。下载后解压。

六、配置OpenGL项目

6.1 配置步骤总览

在VC下使用OpenGL,属于对三方代码的管理,因此,围绕OpenGL的配置过程,实际上是对项目的一种定制。这里的定制需要几个方面:

  • 1 生成一个项目地址,建议固定一个OpenGL项目地址,内含多个OpenGL项目,这样可以集中配置环境。
  • 2 配置glad,opengl核心库
  • 3 配置glfw,opengl界面

6.2 集中部署OpenGL的项目环境

在这里插入图片描述

1)在D盘生成一个Vstudent总目录,该目录存放许多不同的C++项目
2)在D盘的Vstudent目录下,生成AboutOpenGL目录,在该目录下生成具体OpenGL项目。
3)用VC++管理平台生成第一个OpenGL项目:firstOpenGL
4)在AboutOpenGL安置OpenGL的环境支持。
5)在VC开发界面配置include、lib。

先给出测试代码,建议边配置,边调试代码,将该代码调通了,安装也就成功了。

#include <glad/glad.h>  
#include <GLFW/glfw3.h>
#include <glad.c>class Window
{public:GLFWwindow* win = 0;int w = 0; int h = 0;char* title = 0;char* glsl_version = (char*)"#version 330";int SwapInterval = 1;static void glfw_error_callback(int error, const char* description){fprintf(stderr, "Glfw Error %d: %s\n", error, description);}static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods){if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GLFW_TRUE);}static void setup_opengl_viewport(int width, int height){glViewport(0, 0, width, height);}static void framebuffer_size_callback(GLFWwindow* window, int width, int height){setup_opengl_viewport(width, height);}Window(char* title, int w = 300, int h = 300, int OpenGLVersionMajor = 4, int OpenGLVersionMinor = 6) : title(title), w(w), h(h){glfwSetErrorCallback(glfw_error_callback); if (!glfwInit()) { return; }glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, OpenGLVersionMajor); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, OpenGLVersionMinor);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE); // GLFW_OPENGL_COMPAT_PROFILE GLFW_OPENGL_CORE_PROFILE// glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // for mac os it's neededglfwWindowHint(GLFW_RESIZABLE, GL_TRUE);// glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); // for debugwin = glfwCreateWindow(w, h, title, NULL, NULL); if (!win) { printf("Failed to create GLFW window\n"); close(-1); return; } glfwMakeContextCurrent(win);if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { printf("Failed to initialize GLAD\n"); close(-1); return; }setup_opengl_viewport(w, h);glfwSwapInterval(SwapInterval); //must be used after current context set, the default is 0, which means show the new content once available, 1 is the prefered valueglfwSetFramebufferSizeCallback(win, Window::framebuffer_size_callback); glfwSetKeyCallback(win, key_callback);//------------- opengl global settings ----------------// glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);// glBlendFunc(GL_SRC_ALPHA, GL_SRC_ALPHA); glEnable(GL_BLEND); //glEnable(GL_DEPTH_TEST);}~Window(){close(0);}int close(int r){if (win) glfwDestroyWindow(win); glfwTerminate(); return r;}};void company(){int w = 300, h = 300;Window win((char*)"Lines And Chars", w, h);while (!glfwWindowShouldClose(win.win)){glClearColor(1.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); // 填充红色背景glFlush();glfwSwapBuffers(win.win); // swap buffer to show new contentglfwPollEvents(); // response to user operations on the window, process the events by default handlers// glfwWaitEvents(); // for static rendering content}}int main()
{company();
}

6.3 如何配置glad

分两个配置:

  • include
  • lib
    1)添加包含路径:
    项目属性 - C/C++ - additional include directories:

D:\VStudent\AboutOpenGL\glad\include;D:\VStudent\AboutOpenGL\glad\src
在这里插入图片描述

2)在项目中添加glad库lib:
在这里插入图片描述

6.4 配置glfw库:

分两个配置:

  • include
  • lib
    在项目中添加glfw库:
    1)配置include路径
    项目属性 - C/C++ - additional include directories: $(SolutionDir)libs\glfw\include;
    在这里插入图片描述

2)配置lib文件
lib文件路径:
项目属性 - Linker - additional library directories: $(SolutionDir)libs\glfw\lib-vc2022;
lib文件名称
项目属性 - Linker - input - additional dependencies: glfw3.lib,opengl32.lib,user32.lib,gdi32.lib,shell32.lib
在这里插入图片描述

7 测试代码

在这里插入图片描述
表明当前安装基本正确。但中间出了一个错误,是撞运气排除的。

在这里插入图片描述
错误原因正在探索中…


http://www.mrgr.cn/p/07385753

相关文章

密码学《图解密码技术》 记录学习 第十二章

目录 第十二章 12.1 骡子的锁匠铺 12.2 本章学习的内容 12.3 使用随机数的密码技术 12.4 随机数的性质 12.4.1 对随机数的性质进行分类 12.4.2 随机性 12.4.3 不可预测性 12.4.4 不可重现性 小测验 1 骰子 &#xff08;答案见 1…

time:Python的时间时钟处理

前言 time库运行访问多种类型的时钟,这些时钟用于不同的场景。本篇,将详细讲解time库的应用知识。 获取各种时钟 既然time库提供了多种类型的时钟。下面我们直接来获取这些时钟,对比其具体的用途。具体代码如下: import timeprint(time.monotonic()) print(time.monotonic_…

时间函数的简单理解和应用(time.h)

目录关于时间的函数及tm结构体描述对函数的简单理解操作函数功能实现 关于时间的函数及tm结构体描述time.h头文件中常用的几个函数描述如下:序号 函数&描述1 time_t time(time_t *tloc)最基础的函数,计算当前时间,并返回成 time_t(aka long int)格式而且返回值是从Epoch…

FastAPI vs Flask: 选择最适合您的 Python Web 框架

文章目录 1. 简介2. 安装和设置3. 路由和视图4. 自动文档生成5. 数据验证和序列化6. 性能和异步支持结论 在 Python Web 开发领域&#xff0c;FastAPI 和 Flask 是两个备受欢迎的选择。它们都提供了强大的工具和功能&#xff0c;但是在某些方面有所不同。本文将比较 FastAPI 和…

《二十三》Qt 简单小项目---视频播放器

QT 使用QMediaPlayer实现的简易视频播放器 效果如下&#xff1a; 功能点 播放指定视频点击屏幕暂停/播放开始/暂停/重置视频拖拽到指定位置播放 类介绍 需要在配置文件中加入Multimedia, MultimediaWidgets这俩个库。 Multimedia&#xff1a;提供了一套用于处理音频、视频…

Streamlit:快速构建可视化网页(数据科学必备)

很多算法工程师在完成数据分析、模型训练或者项目总结的时候,往往只能通过ppt汇报,添加数据图表、截图模型实验结果等。如果想提供一个前端演示demo,通常可以搭建flask服务,但是flask需要学习很多前端知识,如css、html等,这又是一个深之又深的坑。那有没有什么工具能够跳…

「Dasha and Photos」Solution

简述题意 给定一个 n m n \times m nm 的方格&#xff0c;每个格子里有一个小写英文字母。 现在你有 k k k 个 n m n \times m nm 的方格&#xff0c;这些方格都是给定方格的基础上将左上角为 ( a i , b i ) (a_i,b_i) (ai​,bi​)&#xff0c;右下角为 ( c i , d i ) …

SpringBoot项目GraalVM迁移

一些背景 一直想把项目迁移到使用GraalVM构建出的原生应用上,但是在前段时间的一次尝试后,发现很难做到,其中一个最主要原因就在于我目前手头上没有X86架构的电脑。平时我使用的是一个M1处理器的MacBook,编译出的Docker镜像架构指令集也是Arm64的,无法在我的X86服务器启动…

Android Studio报错:Constant expression required

【出现的问题】&#xff1a; 使用JDK17以上版本&#xff0c;switch语句报错&#xff1a;Constant expression required 【解决方法】&#xff1a; 在gradle.properties配置文件下添加代码&#xff1a; android.nonFinalResIdsfalse 如图&#xff1a; 接着再点击右上角的Sync…

国内验签SSL证书——数据不出境,政务、高校、金融机构必备

涉及金融、政务、教育等重要领域的网站&#xff0c;国家要求是重要数据坚决不能出境。特别是《中华人民共和国网络安全法》的实施&#xff0c;国内验签SSL证书成为了提升网站安全性、保护用户数据和维护网站信誉的重要工具。 国内验签SSL证书的优势 1数据不出境 根据国家相关法…

基于springboot+mybatis+vue的项目实战之(后端+前后端联调)

步骤&#xff1a; 1、项目准备&#xff1a;创建数据库&#xff08;之前已经创建则忽略&#xff09;&#xff0c;以及数据库连接 2、建立项目结构文件夹 3、编写pojo文件 4、编写mapper文件&#xff0c;并测试sql语句是否正确 5、编写service文件 6、编写controller文件 …

PLC学习笔记

PLC学习笔记 前言一、一些基操知识二、GX works2编程2.1 位逻辑1.2 中间寄存器1.3 PLC的扫描方式 总结 前言 我这个人真的是太渴望知识了~ 一、一些基操知识 一般X表示输入&#xff0c;Y表示输出。一般八个为一组X0~X7M表示中间寄存器&#xff0c;M0~M7时间T、计数C 二、GX …

Java基于Spring Boot框架的课程管理系统(附源码,说明文档)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

董浩影评

本文来自博客园,作者:↑-↑-我-的-仓-鼠-↑-↑,转载请注明原文链接:https://www.cnblogs.com/donghao99/p/18182035

《视觉十四讲》例程运行记录(5)——运行ch8视觉里程计2光流法和直接法的实践例程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、运行ch8的例程代码1. 编译例程代码前的修改2. 编译例程3. 编译报错(1) 报错一&#xff1a;使用cmake .. 编译时出现(2) 报错二&#xff1a;make编译时出现(3) 报…

Rust | 实现 API 限速操作 Example

在这篇文章中,我们将讨论如何在 Rust 中实现 API 限速。当涉及到生产中的服务时,是为了确保不良行为者不会滥用 API——这就是 API 限速的作用所在。 我们将实现 “滑动窗口” 算法,通过动态周期来检查请求历史,并使用基本的内存 hashmap 来存储用户 IP 及其请求时间。我们…

synchronized关键字的底层原理

1synchronized关键字的底层原理 Monitor 举个例子&#xff1a; 1.线程1执行synchronized代码块&#xff0c;里面用到了lock(对象锁)。首先会让这个lock对象和monitor关联&#xff0c;判断monitor中的owner属性是否为null。如果为null直接获取对象锁。owner只能关联一个线程。 2…

【JUC】并发编程 Synchronized 锁升级原理

Synchronized如何实现同步/互斥的效果&#xff1f; monitorenter&#xff1a; 将锁对象对象头中Mark Word的前30bit替换成指向操作系统中与其关联的monitor对象&#xff0c;将锁记录位状态改为10 monitorexit&#xff1a; 将锁对象对象头中Mark Word进行重置&#xff0c;重新恢…

Tasks 和算子链

Flink中的每一个操作算子称为一个Task(任务),算子的每个具体实例则称为SubTask(子任务),SubTask是Flink中最小的处理单元,多个SubTask可能在不同的机器上执行。一个TaskManager进程包含一个或多个执行线程,用于执行SubTask。 TaskManager中的一个Task Slot对应一个执行…

MT3516W-ASEMI工业电源专用MT3516W

MT3516W-ASEMI工业电源专用MT3516W编辑:ll MT3516W-ASEMI工业电源专用MT3516W 型号:MT3516W 品牌:ASEMI 封装:MTW-5 最大重复峰值反向电压:1600V 最大正向平均整流电流(Vdss):35A 功率(Pd):大功率 芯片个数:5 引脚数量:5 类型:插件整流桥、整流方桥 正向浪涌电流:45…