[openGL]在ubuntu20.06上搭建openGL环境

就在刚刚, 我跑上了一个6小时后出结果的测试程序. 离下班还有很久, 于是我打开了接单群 , 发现了很多可以写的openGL项目. 但是!!我的电脑现在是ubuntu呀, 但是不要慌!!!接下来我一步一步教你如何完美搭建一个ubuntu上的openGL环境. 保证一个坑也不会踩!

文章目录

  • 创建项目工作区
  • 工作区配置依赖
    • 1. glad
    • 2. glfw
      • 1. 安装依赖
      • 2. 下载源码, 编译
  • 编写opengl程序, 构建运行

创建项目工作区

在windows中开发opengl程序, 我们直接用visualStudio生成项目然后用GUI配置包含路径就行, 但是ubuntu没有那么方便的IDE, 所以我们手动来创建工作区. 假设咱的程序计划放在目录~/openGL下

  1. cd ~
  2. mkdir openGL
    我习惯将程序源码放到src下, 头文件放在include中, 所以建俩文件夹先(当然你也可以根据你喜欢的习惯配置路径)
  3. cd openGL
  4. mkdir src
  5. mkdir include
    初步建立好了工程代码的位置, 配置一下第三方依赖. 我们知道opengl主要依赖glfw, glad, 所以接下来主要配置这俩玩意儿. 为了保持项目文件的整洁, 我再新建一个目录叫3rdparty; 最后建一个文件夹用来放build相关的东西
  6. mkdir 3rdparty
  7. mkdir build

工作区配置依赖

接下来正式地配置依赖.

#0、安装查看OpenGL版本支持的工具
sudo apt-get install mesa-utils
glxinfo | grep OpenGL#1、安装opengl的核心库sudo apt-get install libgl1-mesa-dev*
sudo apt-get install build-essential#2、安装OpenGL Librarysudo apt-get install libgl1-mesa-dev#3、安装OpenGL Utilities,sudo apt-get install libglu1-mesa-dev
sudo apt-get install libegl1-mesa-dev#4、安装OpenGL Utility Toolkitsudo apt-get install libglut-dev

然后单独配置glad和glew

1. glad

首先配置glad, 它是一个开源库, 提供了在线配置的服务, 咱访问这个服务, 指定需要的版本就能让它自动加载所有相关opengl函数

  1. 首先到官网: https://glad.dav1d.de/
  2. 设置语言为c/c++, 选择你需要的gl版本,譬如我选最新的4.6, 然后选择core模式(如果你需要的是立即渲染模式, 也可以保持默认), 勾选Generate a loader, 然后generate!
    在这里插入图片描述

下载下来之后是个压缩包, 我们先在咱的项目文件夹的第三方依赖中新建一个叫glad的文件夹, 然后把压缩包解压到那里面.

  1. cd ~/openGL/3rdparty
  2. mkdir glad
  3. 找到刚才下载的glad压缩包->右键提取到->解压到~/openGL/3rdparty/glad
    最后咱这个~/openGL/3rdparty目录下是这样的
    在这里插入图片描述

2. glfw

1. 安装依赖

据我所知ubuntu20.04有两种桌面环境: X11和Wayland, 这两种需要安装的东西不一样, 先看一下自己的是哪一种, 再分别安装
查看的命令:

echo $XDG_SESSION_TYPE

如果是X11,执行这个:

sudo apt install xorg-dev

如果是Wayland, 执行这个:

sudo apt install libwayland-dev libxkbcommon-dev wayland-protocols extra-cmake-modules

2. 下载源码, 编译

  1. 下载源码: https://github.com/glfw/glfw/releases/download/3.3.9/glfw-3.3.9.zip
  2. 在你喜欢的位置新建一个文件夹叫glfw, 之后咱对glfw的编译就在这个文件夹下: mkdir ~/glfw && cd ~/glfw
  3. 我们把glfw这个文件夹分为两个部分来看: 第一部分放glfw的源码, 剩下的部分放源码build之后的结果; 因此, 我在glfw中新建一个文件夹叫src, 另一个叫build: mkdir src && mkdir build
  4. 我们把第一步下载的源码解压到刚才新建的src文件夹, 然后执行cmake构建命令: cmake -S ~/glfw/src -B ~/glfw/build
  5. 最后build一下就成功了: cd ~/glfw/build && make

编写opengl程序, 构建运行

现在依赖配好了, 咱浅写一个能跑就行的程序让它编译运行一下.
回到我们的工作区

  1. cd ~/openGL/src && vim main.cpp
  2. 写个测试程序 ~/openGL/src/main.cpp
#include <iostream>#include <glad/glad.h>
#include <GLFW/glfw3.h>void framebufer_size_callback(GLFWwindow *_window, int _width, int _height);int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);GLFWwindow *win_handle = glfwCreateWindow(600, 600, "终于配好环境了感动+10086", NULL, NULL);if (win_handle == NULL){std::cout << "Failed to crate GLFW Window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(win_handle);if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}glViewport(0, 0, 600, 600);glfwSetFramebufferSizeCallback(win_handle, framebufer_size_callback);while (!glfwWindowShouldClose(win_handle)){glfwSwapBuffers(win_handle);glfwPollEvents();}glfwTerminate();return 0;
}void framebufer_size_callback(GLFWwindow *_window, int _width, int _height)
{glViewport(0, 0, _width, _height);
}
  1. 写完了之后咱写一下编译配置文件~/openGL/CMakeList.txt
    1. cd ~/openGL && vim CMakeList.txt
cmake_minimum_required(VERSION 2.8)project(opengl_test)# Include files
#glad
include_directories(${PROJECT_SOURCE_DIR}/3rdparty/glad/include/)add_executable(main ${PROJECT_SOURCE_DIR}/src/main.cpp${PROJECT_SOURCE_DIR}/3rdparty/glad/src/glad.c)target_link_libraries(main glfw GL dl)
  1. 开编! cd ~/openGL/build && cmake .. && make
  2. 编完了运行: ./main
    在这里插入图片描述

大功告成!

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

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

相关文章

《Git学习笔记:IDEA整合Git》

在IDEA中集成Git去使用 通过Git命令可以完成Git相关操作&#xff0c;为了简化操作过程&#xff0c;我们可以在IDEA中配置Git&#xff0c;配置好后就可以在IDEA中通过图形化的方式来操作Git。 在IDEA开发工具中可以集成Git&#xff1a; 集成后在IDEA中可以看到Git相关图标&…

【MySQL】mysql集群

文章目录 一、mysql日志错误日志查询日志二进制日志慢查询日志redo log和undo log 二、mysql集群主从复制原理介绍配置命令 读写分离原理介绍配置命令 三、mysql分库分表垂直拆分水平拆分 一、mysql日志 MySQL日志 是记录 MySQL 数据库系统运行过程中不同事件和操作的信息的文件…

Mac M1 Parallels CentOS7.9 Rancher + K8S + Gitlab + Jenkins +Harbor CICD

一、资源清单 机器名称IP地址角色k8srancher高可用部署: https://blog.csdn.net/qq_41594280/article/details/135312148rancher10.211.55.200管理K8S集群k8svip10.211.55.199K8S VIPmaster0110.211.55.201K8S集群主节点master0210.211.55.202K8S集群主节点master0310.211.55.…

redis数据结构源码分析——跳表zset

文章目录 跳表的基本思想特点节点与结构跳跃表节点zskiplistNode属性 跳跃表链表属性 跳表的设计思想和优势API解析zslCreate&#xff08;创建跳跃表&#xff09;zslCreateNode&#xff08;创建节点&#xff09;zslGetRank&#xff08;查找排位&#xff09;zslDelete&#xff0…

Tiktok/抖音旋转验证码识别

一、引言 在数字世界的飞速发展中&#xff0c;安全防护成为了一个不容忽视的课题。Tiktok/抖音&#xff0c;作为全球最大的短视频平台之一&#xff0c;每天都有数以亿计的用户活跃在其平台上。为了保护用户的账号安全&#xff0c;Tiktok/抖音引入了一种名为“旋转验证码”的安…

flex布局之美,以后就靠它来布局了

写在前面 在很久很久以前&#xff0c;网页布局基本上通过table 元素来实现。通过操作table 中单元格的align 和valign可以实现水平垂直居中等 再后来&#xff0c;由于CSS 不断完善&#xff0c;便演变出了&#xff1a;标准文档流、浮动布局和定位布局 3种布局 来实现水平垂直居…

恒源云GPU服务器使用Linux图形化界面

编程如画&#xff0c;我是panda&#xff01; 干货满满&#xff0c;不要走开~ 前言 前一节分享了如何在GPU云服务器上创建实例并运行YOLOV5项目&#xff0c;但是使用命令行的方式容易劝退很多小白&#xff0c;并且有些环境配置是需要图形化界面的&#xff0c;所以这一节就教大家…

Redis常见命令、数据类型

我们可以通过Redis的中文文档&#xff1a;Redis命令中心&#xff08;Redis commands&#xff09; -- Redis中国用户组&#xff08;CRUG&#xff09;&#xff0c;来学习各种命令。 也可以通过菜鸟教程官网来学习&#xff1a;Redis 键(key) | 菜鸟教程 一、Redis数据结构介绍 Red…

对Transformer的理解。

要理解Transformer&#xff0c;需要先理解注意力机制&#xff0c;下面大部分内容来自台大教授李宏毅老师讲课资料。 注意力机制 之前使用的MLP&#xff0c;CNN&#xff0c;RNN模型可以解决一些简单序列问题&#xff0c;但当序列长度太长容易失去效果&#xff0c;原因是看了新…

精确掌控并发:固定时间窗口算法在分布式环境下并发流量控制的设计与实现

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;14&#xff09;篇。点击上方关注&#xff0c;深入了解支付系统的方方面面。 本篇主要介绍分布式场景下常用的并发流量控制方案&#xff0c;包括固定时间窗口、滑动时间窗口、漏桶、令牌桶、分布式消息中间件…

力扣每日一练(24-1-14)

做过类似的题&#xff0c;一眼就是双指针&#xff0c;刚好也就是题解。 if not nums:return 0p1 0 for p2 in range(1, len(nums)):if nums[p2] ! nums[p1]:p1 1nums[p1] nums[p2]return p1 1 根据规律&#xff0c;重复的数字必定相连&#xff0c;那么只要下一个数字与上一…

Fluent 动网格应用:2.5D 网格重构

1 概述 2.5D 网格重构是一种快速网格重构方法&#xff0c;主要应用于涡旋压缩机等存在复杂平面运动且无法简化为二维计算的问题。 涡旋压缩机工作原理&#xff08;视频源&#xff1a;维基百科&#xff09; 适用于 2.5D 动网格的问题特点&#xff1a; 计算域几何形状为柱体类形…

八. 实战:CUDA-BEVFusion部署分析-导出带有spconv的SCN网络的onnx

目录 前言0. 简述1. 使用spconv进行SCN的推理测试2. 导出onnx3. 补充-装饰器钩子函数总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第八章——实战&#x…

反向代理+web集群+mysql mha实验总结

一、实验步骤 1、部署框架前准备工作 服务器类型部署组件ip地址DR1调度服务器 主&#xff08;ha01&#xff09;KeepalivedLVS-DR192.168.86.13DR2调度服务器 备 (ha02)KeepalivedLVS-DR192.168.86.14web1节点服务器 (slave01)NginxTomcatMySQL 备MHA managerMHA node192.168.8…

cmake 中的set用法

可以后面跟一串字符串 set — CMake 3.0.2 Documentation

esxi-vSphere

esxi安装 vCenterServer 安装 给予 esxi,一般一个esxi &#xff0c;就安装一个 vCenter 关于 vCenter Server 安装和设置 vSphere Client安装 软件下载 VMware vSphere 8.0 download: 百度网盘链接&#xff1a;百度网盘 请输入提取码 链接: https://pan.baidu.com/s/1juyKl…

【Java SE语法篇】9.抽象类和接口

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ 文章目录 1. 抽象类1.1 抽象类的概念1.2 抽象类的语法1.3 抽象…

【RT-DETR改进涨点】为什么YOLO版本的RT-DETR训练模型不收敛的问题

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 其中提到的多个版本ResNet18、ResNet34、ResNet50、ResNet101为本人根据RT-…

书生·浦语大模型实战营作业(四)

基础作业&#xff1a; 构建数据集&#xff0c;使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你的智能小助手&#xff0c;效果如下图所示&#xff0c;本作业训练出来的模型的输出需要将不要葱姜蒜大佬替换成自己名字或昵称&#xff01; 数据集 回答结果 进阶作…

指针面试题详解

文章目录 指针笔试题解析笔试题1笔试题2笔试题3笔试题4笔试题5笔试题6笔试题7笔试题8 总结 指针笔试题解析 数组名是首元素地址,两种情况除外: 1.sizeof(数组名) , 这是这是计算整个数组的大小,单位是字节; 2.&数组名 , 得出的是整个数组的地址; 笔试题1 #include<st…