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

news2025/2/23 19:22:07

就在刚刚, 我跑上了一个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
    在这里插入图片描述

大功告成!

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

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

相关文章

线性代数 --- 矩阵行列式的性质

矩阵行列式的性质 矩阵的行列式(Determinant)既可以表示成“det A”,也可以用“|A|”来表示。矩阵的行列式是一个数&#xff0c;这个数能够反应一些关于矩阵的信息。行列式只对方阵有效。 若矩阵A为&#xff1a; 则A的行列式为&#xff1a; 最重要的三个性质 性质1&#xff1a;…

01正则化

正则化 正则化的概念 正则化(Regularization) 是机器学习中对原始损失函数引入额外信息&#xff0c;以便防止过拟合和提高模型泛化性能的一类方法的统称。也就是目标函数变成了原始损失函数额外项 常用的正则化一般有两种L1正则化和L2正则化 L1正则化的一般表达式: a r g m…

Openstack云计算(五)ceph

Ceph简介&#xff1a; Ceph是一种为优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统。ceph]的统一体现在可以提供文件系统、块存储和对象存储,分布式体现在可以动态扩展。在国内一些公司的云环境中,通常会采用ceph作为openstack的唯一后端存储来提高数据转发效率…

基于Java SSM框架实现音乐推荐网站项目【项目源码+论文说明】

基于java的SSM框架实现音乐推荐网站演示 摘要 中国风音乐推介网站近年来已成为风靡全球的新兴艺术形式。国内涌现出了大批优秀、有才华的爱好者和许多经久不衰的经典作品。中国风音乐推介网站的兴起打破了音乐界格局,也突破了原有分类唱法发展中的瓶颈,为声乐艺术的发展开辟了…

儿童护眼台灯什么品牌好?儿童护眼台灯品牌排行

台灯大家都不陌生&#xff0c;但使用它的人有多少呢&#xff0c;准确使用的人又有多少呢&#xff0c;我们就是为了照明才会去买台灯&#xff0c;而时间久了&#xff0c;你就会眼睛刺痛&#xff0c;那就是没有选对台灯和没有正确使用台灯&#xff0c;还是建议大家买具有护眼功能…

python爬虫实战(9)--获取澎pai热榜

1. 需要的类包 import pandas as pd import requests2. 请求地址 通过分析&#xff0c;数据可以直接从接口获取&#xff0c;无需解析页面标签&#xff0c;直接取出我们需要的数据即可。 def fetch_hot_news(api_url):response requests.get(api_url)if response.status_cod…

金融帝国实验室(Capitalism Lab)V10版本游戏平衡性优化与改进

即将推出的V10版本中的各种游戏平衡性优化与改进&#xff1a; ————————————— 一、当玩家被提议收购一家即将破产的公司时&#xff0c;显示商业秘密。 当一家公司濒临破产&#xff0c;玩家被提议收购该公司时&#xff0c;如果玩家有兴趣评估该公司&#xff0c;则无…

TypeScript进阶(三)类型演算与高级内置类型

✨ 专栏介绍 TypeScript是一种由微软开发的开源编程语言&#xff0c;它是JavaScript的超集&#xff0c;意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript&#xff0c;使其更适合大型项目和团队开发。 在TypeS…

python爬虫实战(8)--获取虎pu热榜

1. 需要的类库 import requests from bs4 import BeautifulSoup import pandas as pd2. 请求地址 def fetch_data():url "https://bbs.xxx.com/" # Replace with the actual base URLresponse requests.get(url)if response.status_code 200:return response.c…

外汇天眼:Options与OneTick合作,共同打造全球SAAS分析平台

Options Technology&#xff0c;一家为全球金融领域提供云服务的托管服务提供商&#xff0c;今天宣布与OneMarketData及其旗舰产品OneTick平台的合作。 Options将使OneTick订户能够访问其庞大的市场数据存储库&#xff0c;包括股票、外汇、期货、期权和固定收益数据&#xff0…

掌握Sketch:软件介绍与实用技巧分享

Sketch是最好的UI软件之一。它可以快速交互迭代&#xff0c;每个页面之间的小部件可以直接复制粘贴并修改。在整体架构布局中&#xff0c;可以直接下载很多Mocaup模板&#xff0c;所以非常快。这个工具完全是为应用程序设计的&#xff0c;比PS好得多。 如果你不知道sketch软件…

Android Firebase (FCM)推送接入

官方文档&#xff1a; 向后台应用发送测试消息 | Firebase Cloud Messaging 1、根级&#xff08;项目级&#xff09;Gradlegradle的dependencies中添加&#xff1a; dependencies {...// Add the dependency for the Google services Gradle pluginclasspath com.google.gm…

open3d相关操作总结

open3d其实有很多交互式命令&#xff0c;在运行程序打开了open3d渲染的窗口后&#xff0c;鼠标点击窗口&#xff0c;按H就会弹出&#xff0c;交互命令的帮助&#xff0c;如下图所示&#xff1a; 其中比较常用的有&#xff1a; Q &#xff1a;退出当前窗口 H&#xff1a;打印帮…

CAN与CAN FD通信之间存在的问题

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”&#xff0c;即可获得canoe入门到精通电子书和INCA软件安装包&#xff08;不带授权码&#xff09;下载地址。 目录 1、通讯速率和数据长度不同的问题 2、非ISO CAN FD与ISO CAN FD设备的通讯问题 3、多设备切换的通…

PHP企业物资管理系统源码带文字安装教程

PHP企业物资管理系统源码带文字安装教程 技术架构 主要框架 : PHP7.0 laravel5.4  mysql5.5.36 composer1.3.2(依赖管理) 前端 : jquery bootstrap jstree&#xff08;树形结构&#xff09; echart&#xff08;图表&#xff09; layer&#xff08;弹出层&#xff09; 企…

参数小,性能强!开源多模态模型—TinyGPT-V

安徽工程大学、南洋理工大学和理海大学的研究人员开源了多模态大模型——TinyGPT-V。 TinyGPT-V以微软开源的Phi-2作为基础大语言模型&#xff0c;同时使用了视觉模型EVA实现多模态能力。尽管TinyGPT-V只有28亿参数&#xff0c;但其性能可以媲美上百亿参数的模型。 此外&…

TDengine 签约西电电力

近年来&#xff0c;随着云计算和物联网技术的迅猛发展&#xff0c;传统电力行业正朝着数字化、信息化和智能化的大趋势迈进。在传统业务基础上&#xff0c;电力行业构建了信息网络、通信网络和能源网络&#xff0c;致力于实现发电、输电、变电、配电和用电的实时智能联动。在这…

企业办公终端文件数据\资料防泄密软件系统 | 自动智能透明加密保护核心文件,防止外泄

文档加密/数据安全 天锐绿盾是一款终端文件数据防泄密软件系统&#xff0c;采用自动智能透明加密技术&#xff0c;可以保护核心文件不被外泄。该软件通过对终端文件的加密处理&#xff0c;使得文件只能在经过授权的计算机上正常显示和使用&#xff0c;一旦离开授权范围&#x…

three.js : tweenjs创建threejs动画

效果&#xff1a; 代码 <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div> <div class"box-right"><…

在本地服务器发送邮件不可以,生产环境下跑可以

公司一般会给一个smtp-xxxx.com mail:host: smtp-xxxx.comport: 25properties:mail:smtp:starttls:enable: falsedebug: true然后你会使用堡垒机映射ip 会发现在本地邮件根本不会发出去,只能拿到虚拟机上跑 解决方案 我们需要把smtp-xxxx.com,改成对应的ip地址,只需要把smtp…