[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 Library

sudo 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 Toolkit

sudo 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
    在这里插入图片描述

大功告成!

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

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

相关文章

借助Gitee将typora图片上传CSDN

概述 前面已经发了一个如何借助Github将typora上的图片上传到csdn上&#xff0c;但这有个缺陷&#xff1a;需要科学上网才能加速查看已经上传到github上的图片&#xff0c;否则就会出现已经上传的图片&#xff0c;无法正常查看的问题 如何解决&#xff1f; 那就可以使用Gite…

前端(angular)在谷歌(chrome)浏览器使用高德地图api定位报错超时geolocation time out ,能定位但不安全的方法

已知信息整合 正如大家搜到的大佬说的原因是chrome浏览器本身的问题。我换成edge就可以。高德地图给出的地图定位api的常见问题&#xff0c;这是另外还有个别浏览器&#xff08;如google Chrome浏览器等&#xff09;本身的定位接口是黑洞 以下是能定位但不安全的方法 连接上…

Java面试之集合篇

前言 本篇主要总结JAVA面试中关于集合相关的高频面试题。本篇的面试题基于网络整理以及自己的总结编辑。在不断的完善补充哦。欢迎小伙伴们在评论区发表留言哦&#xff01; 1、基础 1.1、Java 集合框架有哪些&#xff1f; Java 集合框架&#xff0c;大家可以看看 《Java 集…

Excel·VBA按指定顺序排序函数

与之前写过的《ExcelVBA数组冒泡排序函数》不同&#xff0c;不是按照数值大小的升序/降序对数组进行排序&#xff0c;而是按照指定数组的顺序&#xff0c;对另一个数组进行排序 以下代码调用了《ExcelVBA数组冒泡排序函数》bubble_sort_arr函数&#xff08;如需使用代码需复制…

18张AI电脑动漫超清壁纸免费分享

18张AI电脑动漫壁纸&#xff0c;紫色系和暗黑系&#xff0c;都很不错&#xff0c;喜欢的朋友可以拿去 CSDN免积分下载

【云计算】云计算概述

1. 云计算概述 1.1 云计算的定义 美国国家标准与技术研究院(NIST)定义 云计算是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、按需的网络访问&#xff0c;进入可配置的计算资源共享池(资源包括网络&#xff0c;服务器&#xff0c;存储&#xff0c;应用软件…

AI墨墨交流群正式成立:探索科技前沿,共建智能未来

在这个充满变革的时代&#xff0c;AI技术正如涌泉般迸发&#xff0c;带来无限可能。我们深感&#xff0c;唯有汇聚智慧&#xff0c;方能更好地驾驭这股前沿科技的潮流。因此&#xff0c;我们自豪地宣布&#xff1a;AI墨墨交流群正式成立了&#xff01;这不仅是一个交流群&#…

小白苦恼:电脑那么多USB口,怎么知道哪个读写更快?

前言 最近有个朋友和小白抱怨&#xff1a;电脑那么多USB接口&#xff0c;有些接口在传输文件的时候实在慢的很。 电脑诞生以来&#xff0c;USB接口就一直存在。但是USB接口还是长得几乎一样&#xff0c;不仔细去研究都不知道哪个USB会更快。 许多小伙伴就会直接放弃辨认&…

阿里云服务器新购、续费、升级优惠活动及代金券领取入口汇总

阿里云作为国内领先的云计算服务提供商&#xff0c;一直以来都为广大的用户提供了优质、稳定、高效的服务。为了更好地满足用户的需求&#xff0c;阿里云会不定期地推出各种优惠活动&#xff0c;包括新购、续费、升级优惠活动以及代金券领取等。本文将为大家详细介绍这些优惠活…

软件测试|详解 Pytest 参数化:简化测试用例的编写

简介 Pytest 是一个广泛使用的 Python 测试框架&#xff0c;它提供了丰富的功能来编写和执行测试用例。其中一个强大的特性是参数化&#xff0c;它允许我们通过一种简洁的方式运行多个输入参数的相似测试用例&#xff0c;从而减少冗余的代码。本文将详细介绍 Pytest 的参数化功…

文心、讯飞、ChatGPT大模型横向比较

三种大模型的横向比较分析发现,大模型最终的优异表现依赖于模型规模的突破。 通过比较不同规模的大模型,分析发现大模型的强大生成能力主要源自模型的参数量级的飞跃。尽管方法论上大同小异,但参数量的指数级增长是实现质的飞跃的关键所在。“大力出奇迹”可以说是大模型取得辉…

电子学会C/C++编程等级考试2023年12月(一级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536 输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。 输出 一行两个数,分…

嵌入式(二)单片机基础 | 单片机特点 内部结构 最小系统 电源 晶振 复位

上一篇文章我们介绍了嵌入式系统 嵌入式系统&#xff08;Embedded System&#xff09;是一种特定用途的计算机系统&#xff0c;它通常嵌入在更大的产品或系统中&#xff0c;用于控制、监测或执行特定的任务。这些系统通常由硬件和软件组成&#xff0c;旨在满足特定的需求&…

Kafka(四)Broker

目录 1 配置Broker1.1 Broker的配置broker.id0listererszookeeper.connectlog.dirslog.dir/tmp/kafka-logsnum.recovery.threads.per.data.dir1auto.create.topics.enabletrueauto.leader.rebalance.enabletrue, leader.imbalance.check.interval.seconds300, leader.imbalance…

JAVA静态引擎企业网站源码带文档

JAVA静态引擎企业网站源码带文档 系统介绍&#xff1a; 1.网站后台采用主流的 SSM 框架 jsp JSTL&#xff0c;网站前台采用freemaker静态化模版引擎生成html5 2.因为是生成的html&#xff0c;无需重复读取数据库&#xff0c;所以访问速度快&#xff0c;轻便&#xff0c;对服务器…

家用洗地机怎么选?家用洗地机排名

现代很多年轻人常常为家庭卫生问题而感到头痛。一整天的工作之后&#xff0c;回到家中还得花费大量时间来处理地面的清理工作&#xff0c;包括吸尘和拖地等繁琐的任务。这些任务让人感到相当烦躁&#xff0c;尤其是对于有小孩的家庭来说&#xff0c;地板上的油污和食物残渣经常…

前端项目构建打包生成Git信息文件

系列文章目录 TypeScript 从入门到进阶专栏 文章目录 系列文章目录前言一、前端项目构建打包生成Git信息文件作用二、步骤1.引入相关的npm包1.1. **fs** 包1.2. **child_process** 包1.3. **os** 包 (非必须 如果你想生成的文件信息中包含当前电脑信息则可用)1.4. **path** 包…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-7二阶系统

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-7二阶系统 1. 二阶系统对初始条件的动态响应 Matlab/Simulink - 2nd Order Syetem Response to IC2. 二阶系统的单位阶跃响应 2nd Order System Unit Step Response3. 二…

UniRepLKNet实战:使用UniRepLKNet实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集一些问题 摘要 大核卷积神经网络&#xff08;ConvNets&#xff09;近年来受到广泛关注&#xff0c;但仍存在两个关键问题需要进一步研究。首先&#xff0c;目前的大型卷积神经网络架构大…

C++枚举类型可以作为返回值类型吗

当然&#xff1a; #include <iostream> // 定义一个枚举类型 enum class Color { RED, GREEN, BLUE }; // 函数返回枚举类型 Color getRandomColor() { static int nextColorIndex 0; Color color Color(nextColorIndex); nextColorIndex; if (nextColor…